修改用Array.fill()填充的矩阵的值会修改整列



所以我有一个矩阵a,维数为n*n,用Array.fill()初始化,就像这样。var A = new Array(n).fill(new Array(n).fill(0))

这很酷,但如果我试图修改它的一个值,整个列都会修改。CCD_ 3修改整个列3。

示例片段:

var n = 4;
var A = new Array(n).fill(new Array(n).fill(0));
console.log(JSON.stringify(A));
A[2][2] = 4;
console.log(JSON.stringify(A)); // ...

为什么?o.o

这是因为您的第一个Array.fill调用使用相同的数组引用来填充这4个点,并且只创建了一个内部数组。因此,您可以使用Array.from来代替第一次填充调用,它将为每个点创建新的数组。

var n = 4;
var A = Array.from(new Array(n), () => new Array(n).fill(0))
console.log(JSON.stringify(A));
A[2][2] = 4;
console.log(JSON.stringify(A)); // ..

每个MDN,Array.fill

如果第一个参数是一个对象,则数组中的每个槽都将引用该对象。

也就是说,如果您在数组中填充的值是一个对象,则所有元素都将引用同一对象,而不是数组的副本

const n = 4;
const array = new Array(n);
for (let i = 0; i < n; i++) array[i] = new Array(n).fill(0);
console.log(JSON.stringify(array));
array[2][2] = 4;
console.log(JSON.stringify(array));

最新更新