首页 > 解决方案 > 为什么改变一个数组会以某种方式改变另一个?

问题描述

我创建了一个旨在将多个多维数组合并在一起的函数

输入“表”当前是包含在对象中的 2 个数组,该函数旨在每次运行命令时运行(我知道效率不是很高,但它适用于需要这样做的高中项目)

打印输入如下所示:

[ [ [ 'a', 1 ], [ 'b', 1 ] ], [ [ 'a', 1 ] ] ]

每次我运行该函数时,期望结果表看起来像这样:

[ [ 'a', 2 ], ['b', 1 ] ]

它不是递增 'tempTable[u][1]' 而是递增连接到输入表 [0] 的数组。

打印原始数组 [ [ 'a', 1 ], [ 'b', 1 ] ] 现在每次运行代码时都会显示 'a' 递增 1。

我不知道为什么它每次都增加原始数组而不是'tempArray',有人可以向我解释为什么它会增加原始表吗?

PS这是这个函数的错,如果我注释掉应该将'tempTable'增加1的行,原始表不会改变。

function combineTable(table) {
  var tempTable = table[0];
  for (var i = 1; i < table.length; i++) { //each table
    for (var u = 0; u < tempTable.length; u++) { //temptable values
      for (var y = 0; y < table[i].length; y++) { //current table values
        if (tempTable[u][0] === (table[i])[y][0]) {
          tempTable[u][1] += (table[i])[y][1];
        } else {
          console.log("Not contained");
        }
      }
    }
  }
}
combineTable([
  [
    ['a', 1],
    ['b', 1]
  ],
  [
    ['a', 1]
  ]
])

标签: javascriptarraysmultidimensional-array

解决方案


您需要Array.prototype.slice()对每个嵌套数组使用该方法。

因此var tempTable = table[0];,您需要使用:

var tempTable = table[0].map(arr => arr.slice());

您不能只说thing = arr[0]多维数组,因为它只返回对值的引用,而不是复制的值。

function combineTable(table) {
  var tempTable = table[0].map(arr => arr.slice()); // This is the line changed
  for (var i = 1; i < table.length; i++) { //each table
    for (var u = 0; u < tempTable.length; u++) { //temptable values
      for (var y = 0; y < table[i].length; y++) { //current table values
        if (tempTable[u][0] === (table[i])[y][0]) {
          tempTable[u][1] += (table[i])[y][1];
        } else {
          console.log("Not contained");
        }
      }
    }
  }
  // Adding console logging for demo
  console.log(table);
  console.log(tempTable);
}

combineTable([
  [
    ['a', 1],
    ['b', 1]
  ],
  [
    ['a', 1]
  ]
])


推荐阅读