javascript - 为什么改变一个数组会以某种方式改变另一个?
问题描述
我创建了一个旨在将多个多维数组合并在一起的函数
输入“表”当前是包含在对象中的 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]
]
])
解决方案
您需要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]
]
])
推荐阅读
- python - python中的分组图表(matplotlib.pyplot)
- javascript - How to receive data in Electron app from protocol link
- html - 无法使选择器在 html 表上工作
- angular - 如何用复选框绑定后端数据?
- java - Java如何在txt文件中显示和搜索相同的值,以便扫描并显示所有记录(如果值在记录中)
- pandas - nunique 的 Dask Grouby 性能太慢。如何提高性能?
- macos - 缓冲的 GNU grep 行在 MacOS 上不起作用
- python - Python中的排序算法
- html - 我的 HTML 文件不会链接到其他 HTML 文件或 CSS
- z3 - 在 SMT-LIB 2 中像 C 一样截断整数