所以我有一个矩阵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));