将数组的副本添加到另一个数组

时间:2019-05-09 18:34:43

标签: javascript arrays

我正在尝试使用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数组的每个迭代,而不是仅包含最新的副本。

3 个答案:

答案 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);