2017-10-16 104 views
2

麻烦与新阵列产生的矩阵阵列

let arr = [[1,2,3], [4,5,6], [7,8,9]] 
 
arr[0][1] = 'X' 
 
arr[1][1] = 'O' 
 

 
console.log(arr);

我试图制定一个初步的井字棋游戏,这个方法来创建表用于我的罚款。

在其他方法阅读了以产生一矩阵表阵列,我发现这个

let newArr = new Array(3).fill(new Array(3)) 
 
newArr[0][1] = 'X' 
 

 
console.log(newArr)

正如我试图返回newArr它实际上与“X”替换整个列。

为什么这样做?我在想,也许在堆栈过程中,我意识到我正在命名一个未定义索引的值,并且对整列完全相同,但我无法确认。

+0

并解释为什么'array.fill'预计1个参数,它会用这个元素填充数组。现在,通过引用来复制对象,因此当您将对象/数组传递给它时,您将使用相同的引用填充数组中的所有值。因此,更新1值会更新所有值。 – Rajesh

+0

非常感谢你,这非常有意义。将Array.fill应用于相同的参考对象绝对不实用。 – jondub

+0

替代方案可以是'Array.from({length:3},(x)=> new Array(3))',但这是一个ES6功能。将适用于您,但需要您自担风险 – Rajesh

回答

1

Array#fill需要一个对象/原语并使用它来填充所有项目。你已经给了函数一个数组,array是一个引用类型,所以它对所有项使用相同的引用,但对象是单一的。那么为什么你会更新所有列。

您可以比较引用以确保单个被创建并用于所有项目。

let newArr = new Array(2).fill(new Array(2)); 
 

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

要像你想创建一个数组,你可以做

let newArr = Array.from({ length: 3 },() => new Array(3)); 
 

 
newArr[0][1] = 'X'; 
 

 
console.log(newArr);

+0

'array.from'的第二个参数是一个映射函数。所以你可以直接做'Array.from({length:3},()=> new Array(3))' – Rajesh

+0

@Rajesh谢谢。编辑 –