JavaScript 如何从引用类型(Array 、 Object)创建一个新的对象

数组的增删改查

1、新增一项
可以使用concat方法,它不会对原有数组进行改动,而是创建一个新数组

let a = [0, 1, 2]
let b = a.concat([3])
console.log(a, b)

2、删除一项
对于删除某一项的操作,splice也不能满足要求,因为该方法会改变原有数组,相应地我们应该使用slice,并结合es next 新特性。

let array = [1,2,3]
const removeIndex =  (array, index) => {
    return [
        ...array.slice(0, index),
        ...array.slice(index + 1),
    ]
}
let newArray = removeIndex(array, 1);

3、更新一项

let array = [1, 2, 3];
const updateIndex = (array, index, cb) => {
    return [
        ...array.slice(0, index),
        cb && cb(array[index]),
        ...array.slice(index + 1),
    ]
}
updateIndex(array, 1, function (data) {
    return data + 1;
});

4、新增也可以使用这种思路,比concat要灵活

let array = [1, 2, 4];
const insertIndex = (array, index, value) => {
    return [
        ...array.slice(0, index),
        value,
        ...array.slice(array.length - 1),
    ]
}
insertIndex(array, 2, 3);

对象的增删改查

1、更新一项

使用ES next新特性的 Object.assign 方法。

第一个参数必须是空对象,因为第一个参数会被改变(接受合并所有参数的值)
我们要更新的值必须放在最后面,因为参数越往后,权限越高。才能覆盖前者重复的内容

let sourceItem = {
    id: 0,
    book: ‘Learn Redux‘,
    avaliable: false
}
Object.assign({}, sourceItem, {
    avaliable: true
})

2、对象操作:新增一项

其实和上面一样,写入新的键值对就算新增嘛

let sourceItem = {
    id: 0,
    book: ‘Learn Redux‘,
    avaliable: false
}

Object.assign({}, sourceItem, {
    fuck: 123
})

3、对象操作:删除一项

let sourceItem = {
    id: 0,
    book: ‘Learn Redux‘,
    avaliable: false,
    fuck: 123
}
let newItem = Object.key(sourceItem).reduce((obj, key) => {
    if (key !== ‘fuck‘) {
        return { ...obj, [key], sourceItem[key] }
    }
    return obj
}, {})

原文地址:https://www.cnblogs.com/CyLee/p/9591683.html

时间: 2024-10-09 05:27:43

JavaScript 如何从引用类型(Array 、 Object)创建一个新的对象的相关文章

JS——数组中push对象,覆盖问题,每次都创建一个新的对象

今天写运动框架时,发现将对象push进数组,后面的值会覆盖前面的值,最后输出的都是最后一次的值.其实这一切都是引用数据类型惹的祸.       如果你也有类似问题,可以继续看下去哦.       下面代码模拟: 将json对象的每个键值对,单独搞成对象,再赋值给数组,最后输出数组.结果数组应该是有三个对象.(for-in用于对象遍历) 原文地址:https://www.cnblogs.com/ajaxlu/p/9212539.html

javascript学习笔记 - 引用类型 Array

二 Array 1.可以通过length属性删除或创建新的数组项 arr = [1,2,3]; arr.length = 4;//增加 [1,2,3,undefined] arr.length = 2;//删除 [1,2]arr[6] = 6; // [1,2,3,undefined,undefined,6] 2.检测数组 Array.isArray() 3.转换方法 调用数组的toString()方法,返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串.实际上,为了创建这个字符串,

通过原型继承创建一个新对象

// 通过原型继承创建一个新对象 function inherit(p){ if (p == null) throw TypeError();//p是一个对象,但不能是null if(Object.create) //如果object.create()存在 return Object.create(p); //直接使用它 var t = typeof p;//否则进行进一步检测 if (t !== "object" && t !== 'function') throw

filter() 方法创建一个新数组

filter快速过滤创建一个新数组 var new_array = arr.filter(callback(element[, index[, array]])[, thisArg]) 参数节 callback 用来测试数组的每个元素的函数.调用时使用参数 (element, index, array).返回true表示保留该元素(通过测试),false则不保留.它接受三个参数: element 当前在数组中处理的元素. index可选 正在处理元素在数组中的索引. array可选 调用了fil

Photoshop脚本 > 使用脚本创建一个新文档

源自:http://coolketang.com/tutorials/menu2lesson1.php 本节将演示如何使用脚本,创建一个空白文档.首先创建一个空白的脚本文档,并保存在硬盘上某个位置. 接着输入脚本代码: //定义一个变量[Width],表示新文档的宽度. var width = 560; //定义一个变量[height],表示新文档的高度. var height = 560; //定义一个变量[resolution],表示新文档的分辨率. var resolution = 72;

分析Linux内核创建一个新进程的过程【转】

转自:http://www.cnblogs.com/MarkWoo/p/4420588.html 前言说明 本篇为网易云课堂Linux内核分析课程的第六周作业,本次作业我们将具体来分析fork系统调用,来分析Linux内核创建新进程的过程 关键词:fork, 系统调用,进程 *运行环境:** Ubuntu 14.04 LTS x64 gcc 4.9.2 gdb 7.8 vim 7.4 with vundle 分析 分析方法说明 PCB包含了一个进程的重要运行信息,所以我们将围绕在创建一个新进程时

第六周分析Linux内核创建一个新进程的过程

潘恒 原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 task_struct结构: struct task_struct {   volatile long state;进程状态  void *stack; 堆栈  pid_t pid; 进程标识符  unsigned int rt_priority;实时优先级  unsigned int policy;调度策略  struct files

分析Linux内核创建一个新进程的过程

一.原理分析 1.进程的描述 进程控制块PCB——task_struct,为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_struct{ volatile long state; //进程状态,-1表示不可执行,0表示可执行,大于1表示停止 void *stack; //内核堆栈 atomic_t usage; unsigned int flags; //进程标识符 unsigned int ptrace; …… } 2.进程的创

用eclipse pydev 创建一个新py文件时 文件的coding设置问题

问题: 当安装好eclipse和pydev后,创建一个project, 创建一个新的py文件,文件头都会自带中文时间.这样在编译的时候会报错. 解决办法之一: 通过设置,可以使新建的文件的文件头自动带一行#coding=utf-8 设置之后,再创建一个新的文件.文件的文件头会自带#coding=utf-8 待续 还有其他方法的朋友,欢迎交流.