更新Javascript 2D数组中的元素会更新整个列

问题描述

我用Java语言创建了一个二维数组(4x4),如下所示:

let visited = new Array(4).fill(new Array(4).fill(false));
console.log(visited);

[
  [ false,false,false ],[ false,false ]
]

当我尝试更新单个元素时,最终会更新整个列。为什么会这样?

visited[0][0] = true;
console.log(visited);

您可以看到此repl

预期:

[
  [ true,false ]
]

实际:

[
  [ true,[ true,false ]
]

解决方法

Array.fill的文档是您的朋友在这里:

请注意,数组中的所有元素都是该确切值。

这告诉您每个子数组实际上都是SAME数组。因此,如果您更改一个,则全部更改。

通过下面的代码,您会看到第一个比较是false,而第二个比较是true

console.log([false,false,false] ===[false,false])

const arr = new Array(4).fill([false,false]);

console.log(arr[0] === arr[1]);

,

使用循环而不是new Array().fill()

来构建矩阵
  let visited = [];

  for (let i = 0; i < 4; i++) {
    visited.push([]);
    for (let j = 0; j < 4; j++) {
      visited[i].push(false);
    }
  }

  visited[0][0] = true;
  console.log(visited);
,

我的朋友更改了创建矩阵的方式,只需使用.map()签出此变体即可:

 let visited = 
    (new Array(4)).fill().map(function(){ return new Array(4).fill(false);});
    visited[0][0] = true;
    console.log(visited)
    
    0: (4) [true,false]
    1: (4) [false,false]
    2: (4) [false,false]
    3: (4) [false,false]

和平:)