Javascript 通过[…]或切片(0)克隆阵列时出现问题

Javascript 通过[…]或切片(0)克隆阵列时出现问题,javascript,ecmascript-6,Javascript,Ecmascript 6,有人能解释一下当我克隆数组时发生了什么吗抛出[…]或.spit(0) 我在控制台上试过了,我觉得已经足够了 const a=[{cid:1,c:[]}]; 常数b=[…a]; 对于(变量i=0;i({…obj})) 但是,如果要复制包含多个嵌套级别的复杂对象数组,或者复制包含其他对象的数组等,则需要对每个对象进行深度复制。为了做到这一点,你可以使用类似的工具或其他工具 这只会创建一个浅拷贝,因此您只会将引用复制到对象。您应该创建一个深度副本,它也会复制对象内部的所有内容。您可以使用lodash(

有人能解释一下当我克隆数组时发生了什么吗抛出[…]或.spit(0)

我在控制台上试过了,我觉得已经足够了

const a=[{cid:1,c:[]}];
常数b=[…a];
对于(变量i=0;i
我将“a”克隆到“b”,并按“b”进行循环,修改“b”,但更改了“a”和“b”?为什么


但是如果我使用.pop或.shift by'b'只更改了'b'

问题:发生这种情况是因为在数组中有一个对象。 你没有复制这个物体。而是将引用复制到对象

解决方案

  • 如果要复制具有一级嵌套的对象数组,可以执行以下操作:

    var _ = require("lodash");
    ...
    const a = [{cid: 1, c: []}];
    const b = _.cloneDeep(a);
    for (var i = 0; i < b.length; i++) {
      b[i].f = 1;                 
    }
    
    const arr2=arr1.map(obj=>({…obj}))

  • 但是,如果要复制包含多个嵌套级别的复杂对象数组,或者复制包含其他对象的数组等,则需要对每个对象进行深度复制。为了做到这一点,你可以使用类似的工具或其他工具


这只会创建一个浅拷贝,因此您只会将引用复制到对象。您应该创建一个深度副本,它也会复制对象内部的所有内容。您可以使用lodash()这样做:

var _ = require("lodash");
...
const a = [{cid: 1, c: []}];
const b = _.cloneDeep(a);
for (var i = 0; i < b.length; i++) {
  b[i].f = 1;                 
}
var=require(“lodash”);
...
常数a=[{cid:1,c:[]}];
常数b=uu.cloneDeep(a);
对于(变量i=0;i
这些只会创建一个浅拷贝。数组是不同的,里面的对象是一样的,我知道。但是为什么呢?是通勤还是轮班?以及如何在不链接到旧数组的情况下克隆和接收新数组。你的意思是我应该对克隆对象使用递归?是的,我刚刚编辑了答案以澄清它。为了对一个对象进行深度复制,你可以使用像
lodash method.\uu.cloneDeep(value)
这样的工具,或者使用递归创建一个自定义函数。谢谢你,我知道我尝试过这种方法),但我认为spread操作符可以将完整副本创建到数组中