[英]Attempting to set single value at Javascript array index. It is mass-assigning values instead
我正在研究矩阵算法,但很早就遇到了问题。
我有以下数组:
[ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ]
我想将其转换为:
[ [ 0, 0, 0 ], [ 0, 9, 0 ], [ 0, 0, 0 ] ]
我试图像这样设置中间值:
array[1][1] = 9
在孤立的环境中,这很好。 但是,在我的递归循环的上下文中,它不起作用,而我最终想到了:
[ [ 0, 9, 0 ], [ 0, 9, 0 ], [ 0, 9, 0 ] ]
所以我的问题是我的程序在哪里出错了?
function matrix(n, array = initArrays(n), i = 0, j = 0) {
if (i > 0) {
return array // <--- returns: [ [ 0, 9, 0 ], [ 0, 9, 0 ], [ 0, 9, 0 ] ]
}
array = addDigit(n, array, i, j)
return matrix(n, array, i + 1, j)
}
function initArrays(n) {
const array = []
const subArray = []
for (let i = 0; i < n; i++) {
subArray.push(0)
}
for (let i = 0; i < n; i++) {
array.push(subArray)
}
return array
}
function addDigit(n, array, i, j) {
// array = [ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ] // <--- uncommenting this line fixes the problem. Why?
array[1][1] = 9
return array
}
matrix(3)
这是我程序的简化人为版本。 目前,它仅重复一次,并设置3x3网格的中间值(忽略j
,用于将来的功能)。
在这里可以看到它的作用:
不起作用:我要修复的内容 https://repl.it/repls/AttentiveWideOrder
工作:黑客解决方案 https://repl.it/repls/CuteSoggyArchitects
hack解决方案的工作方式是在尝试分配我的中间值之前立即手动重置阵列。 我不知道为什么这会有所不同,并感谢任何指出我的错的人。
谢谢。
您需要将独立的数组推送到外部数组。 Javascript使用对象引用,并将相同的引用推入外部数组。
function initArrays(n) { const array = [] const subArray = [] for (let i = 0; i < n; i++) { subArray.push(0) } for (let i = 0; i < n; i++) { array.push(subArray.slice()); // get copy of primitive values } return array } var array = initArrays(3); array[1][1]= 9; console.log(array);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.