我正在尝试使用array.slice()将一个数组的副本添加到另一个数组中,但是当我更新原始副本时,它将更新我添加的副本。更改原始副本后,如何添加未更改的副本?
我尝试在添加时使用result.unshift [... curRow]和result.unshift(curRow.slice())
function game(n) {
var result = [];
let row1=[[1, 2]];
for (var i=1;i<n;i++){
var cur = row1[i];
var prev = row1[i - 1];
row1.push([prev[0] + 1, prev[1] + 1]);
}
result.push(row1.slice());
let curRow = row1.slice();
for (var i=1;i<n;i++){
for (var j = 0; j<curRow.length ;j++){
curRow[j][1]++;
}
result.unshift(curRow.slice());
console.log('curRow =',curRow);
console.log('result = ', result)
}
console.log('result = ', result)
return result
}
game(3);
这是我当前的输出: '结果='[[[1,2],[2,3],[3,4]] '结果='[[[1,3],[2,4],[3,5]],[[1,3],[2,4],[3,5]] '结果='[[[1,4],[2,5],[3,6]],[[1,4],[2,5],[3,6]],[[1,4 ],[2,5],[3,6]]]
我希望结果数组包含curRow数组的每个迭代,而不是仅包含最新的副本。
答案 0 :(得分:1)
在JavaScript中,对象/数组(也称为非基本类型)被赋予引用而不是值。因此,此特定参考指向对象在内存中的位置。您正在使用的变量具有“引用”,而不包含实际的“值”。这就是为什么在game()
函数上使用它时会对其进行突变的原因。
要对此进行处理,您应该在对该数组进行任何操作/更改之前创建该数组的shallow copy。
const copy = originalArray.map(element => ({...element}));
现在,对copy
数组的所有更改将不会应用于originalArray
。
答案 1 :(得分:0)
因为在Javascript中,数组是通过引用处理的,所以当您将数组重新分配给新变量时,新变量仅保存对原始数组的引用。原始数组的任何更改都将反映在其任何实例/引用中(因为它们本质上是同一对象)。
自标准的ES6版本以来,我们Array.from()
可以执行数组内容的复制或重复。
这是我最喜欢的方式,它快速,安全且可读。
Array.from()方法从类似于数组或可迭代对象的对象创建一个浅表复制的新Array实例。 扩展文档 here
检查示例:
let a = [1,2,3,4,5];
let b = Array.from(a);
// modify first array to test
a[0] = 666;
// output second array to check
console.log(b)
// [1,2,3,4,5] OK!
答案 2 :(得分:-1)
您可以使用以下概念:
firstArray=firstArray.concat(...secondArray);