2017-05-04 115 views
0

尝试修改代表井字棋板的二维数组时,出现奇怪的行为。所有数组的第一个元素被修改而不是一个。修改JavaScript多维数组

// BEFORE: squares = [[null,null,null],[null,null,null],[null,null,null]] 
squares[0][0] = 'X'; 
// AFTER: squares = [["X",null,null],["X",null,null],["X",null,null]] 

我能用下面的代码解决问题,但我很好奇为什么发生这种情况。这里是工作代码:

let rowToModify = squares[yCoord].slice(); 
rowToModify[xCoord] = 'X'; 
squares[yCoord] = rowToModify; 
+0

工作得很好 - https://jsfiddle.net/abhitalks/51110618/ – Abhitalks

+0

否则'正方形[0] [0] =' X';现在它可以修改所有的第一个元素。你可能做错了什么。 – Hannan

回答

4

您正在使用相同的阵列三次可能初始化squares。事情是这样的:

row = [null, null, null]; 
squares = [row, row, row]; 

但是因为row都是一样的阵列,当你修改它,它会在所有行修改。

如果你这样做:

squares = [[null,null,null], [null,null,null], [null,null,null]]; 

你不会得到这个问题。

其他代码工作原因是因为slice创建了一个新列表,因此您不再引用原始列表。因此可能会分开修改。

1

尝试这样squares.map(a => a[0]='x')使用Array#map

var squares = [ 
 
    [null, null, null], 
 
    [null, null, null], 
 
    [null, null, null] 
 
] 
 
squares.map(a => a[0]='x') 
 
console.log(squares)