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

我在 Javascript 中创建了一个 2D 数组 (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);

你可以看看这个回复


预期的:


[

  [ 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 ]

]


哆啦的时光机
浏览 143回答 3
3回答

开心每一天1111

用循环构建矩阵,而不是new Array().fill()&nbsp; let visited = [];&nbsp; for (let i = 0; i < 4; i++) {&nbsp; &nbsp; visited.push([]);&nbsp; &nbsp; for (let j = 0; j < 4; j++) {&nbsp; &nbsp; &nbsp; visited[i].push(false);&nbsp; &nbsp; }&nbsp; }&nbsp; visited[0][0] = true;&nbsp; console.log(visited);

红糖糍粑

Array.fill您的朋友的文档在这里:请注意,数组中的所有元素都将是这个精确值。这告诉您每个子数组实际上都是同一个数组。因此,如果你改变其中之一,你就改变了所有这些。查看下面的代码,您会发现第一个比较是false,而第二个比较是trueconsole.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]);

心有法竹

我的朋友改变了创建矩阵的方式,只需使用 .map() 检查这个变体:&nbsp;let visited =&nbsp;&nbsp; &nbsp; (new Array(4)).fill().map(function(){ return new Array(4).fill(false);});&nbsp; &nbsp; visited[0][0] = true;&nbsp; &nbsp; console.log(visited)&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; 0: (4) [true, false, false, false]&nbsp; &nbsp; 1: (4) [false, false, false, false]&nbsp; &nbsp; 2: (4) [false, false, false, false]&nbsp; &nbsp; 3: (4) [false, false, false, false]和平 :)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript