首页 > 解决方案 > Javascript - 在while循环中修改两个数组,两个数组都保留第二个值

问题描述

我有一个数组数据,其中包含一个 nodeData 对象,其中包含一个 id

我制作了数组的 2 个副本:

    const dropAboveData = data.slice();
    const dropBelowData = data.slice();

然后我尝试以不同方式修改我的 2 个复制数组的两个副本

    for(let i = 0; i<data.length; i++){
        dropAboveData[i].nodeData.id = -1;
        dropBelowData[i].nodeData.id = -2;
    }

因此,例如,如果数据中的每条记录都有 data[i].nodeData.id = 0,最后我希望 dropAboveData 包含所有 -1 的 id,而 dropBelowData 包含所有的 -2 的 id。

但相反,data、dropAboveData 和 dropBelowData 似乎都变成了用 -2 填充的数组。

为什么会这样?我虽然 slice() 制作了数组的副本,这样我就不会访问同一个对象?

标签: javascriptarrays

解决方案


Slice做一个浅拷贝

slice() 方法将数组的一部分的浅拷贝返回到从开始到结束(不包括结束)选择的新数组对象中。原始数组不会被修改。

你可以像这样复制一个对象数组:

var data = [{
  'a': '0'
}, {
  'b': '1'
}, {
  'c': '2'
}]
dropAboveData = []
dropBelowData = []

data.map(o => {
  dropAboveData.push(JSON.parse(JSON.stringify(o)));
  dropBelowData.push(JSON.parse(JSON.stringify(o)));
});

dropAboveData[0] = 1; //<-- modify only dropAboveData
dropAboveData[1].b = 99;//<-- modify only dropAboveData

console.log(dropAboveData)
console.log(dropBelowData)


推荐阅读