为什么对一个二维数组单元格的一次赋值会在 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 很大,否则它可能并不重要。