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

时间:2020-11-03 20:11:54

标签: javascript arrays pointers matrix multidimensional-array

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

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

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

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

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

您可以看到此repl

预期:

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

实际:

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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

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

答案 1 :(得分:0)

使用循环而不是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);

答案 2 :(得分:0)

我的朋友更改了创建矩阵的方式,只需使用.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, false, false]
    1: (4) [false, false, false, false]
    2: (4) [false, false, false, false]
    3: (4) [false, false, false, false]

和平:)