为什么对一个二维数组单元格的一次赋值会在 Javascript 中一次填充两个单元格?
Why does a single assignment to one 2d array cell fill two cells at once in Javascript?
我有来自 this leetcode question 的代码:
function digArtifacts(n: number, artifacts: number[][], dig: number[][]): number {
const land: boolean[][] = new Array(n).fill(new Array(n).fill(false))
console.log(land)
dig.forEach(spot => {
console.log(spot, spot[0], spot[1])
land[spot[0]][spot[1]] = true
console.log(land)
})
console.log(land)
return 0
};
有了这个输入
n = 2
artifacts = [[0,0,0,0],[0,1,1,1]]
dig = [[0,0],[0,1]]
使用此标准输出:
[ [ false, false ], [ false, false ] ]
[ 0, 0 ] 0 0
[ [ true, false ], [ true, false ] ] **but expected => [ [ true, false ], [ false, false ] ]
[ 0, 1 ] 0 1
[ [ true, true ], [ true, true ] ] **but expected [ [ true, true ], [ false, false ] ]
[ [ true, true ], [ true, true ] ] **but expected [ [ true, true ], [ false, false ] ]
为什么 land[1][0]
=== true 和 land[1][1]
=== true 从未访问过?
这个:
new Array(n).fill(new Array(n).fill(false))
用 相同数组 的 n
个副本填充新的外部数组。外部 .fill()
的参数只计算一次,因此第二维只涉及一个数组。
您可以创建多个数组,每行一个:
const land: boolean[][] = new Array(n);
land.fill("dummy value");
land.forEach((_, i, rows) =>
rows[i] = new Array(n);
rows[i].fill(false)
);
在(已编辑的)代码中,外部数组首先填充了一个虚拟值。这是必要的,因为 .forEach()
将跳过数组中未初始化的条目。或者,可以使用一个简单的 for
循环,尽管除非 n
很大,否则它可能并不重要。
我有来自 this leetcode question 的代码:
function digArtifacts(n: number, artifacts: number[][], dig: number[][]): number {
const land: boolean[][] = new Array(n).fill(new Array(n).fill(false))
console.log(land)
dig.forEach(spot => {
console.log(spot, spot[0], spot[1])
land[spot[0]][spot[1]] = true
console.log(land)
})
console.log(land)
return 0
};
有了这个输入
n = 2
artifacts = [[0,0,0,0],[0,1,1,1]]
dig = [[0,0],[0,1]]
使用此标准输出:
[ [ false, false ], [ false, false ] ]
[ 0, 0 ] 0 0
[ [ true, false ], [ true, false ] ] **but expected => [ [ true, false ], [ false, false ] ]
[ 0, 1 ] 0 1
[ [ true, true ], [ true, true ] ] **but expected [ [ true, true ], [ false, false ] ]
[ [ true, true ], [ true, true ] ] **but expected [ [ true, true ], [ false, false ] ]
为什么 land[1][0]
=== true 和 land[1][1]
=== true 从未访问过?
这个:
new Array(n).fill(new Array(n).fill(false))
用 相同数组 的 n
个副本填充新的外部数组。外部 .fill()
的参数只计算一次,因此第二维只涉及一个数组。
您可以创建多个数组,每行一个:
const land: boolean[][] = new Array(n);
land.fill("dummy value");
land.forEach((_, i, rows) =>
rows[i] = new Array(n);
rows[i].fill(false)
);
在(已编辑的)代码中,外部数组首先填充了一个虚拟值。这是必要的,因为 .forEach()
将跳过数组中未初始化的条目。或者,可以使用一个简单的 for
循环,尽管除非 n
很大,否则它可能并不重要。