我想使用3x3二维数组存储数据。但是,当我将1分配给g[1][1]
时,我发现输出很奇怪-整个第二个col都分配给了1!
let g = new Array(3).fill( // 3 x 3
new Array(3).fill(0)
);
console.log(g);
g[1][1] = 1;
console.log(g);
此代码输出:
[ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ]
[ [ 0, 1, 0 ], [ 0, 1, 0 ], [ 0, 1, 0 ] ]
我将node
升级到v9.11.1
,此问题仍然没有解决。
我的系统是MacOS High Sierra 10.13.6。
我想问:
谢谢。
答案 0 :(得分:1)
问题是您要用同一个内部数组 的三个引用填充第一个数组。这样,当您对任何实例进行突变时,它都会反映在外部数组的每个条目中,因为它的所有三个项目都是同一数组。如果您希望它可以很好地扩展,则最好使用循环进行此操作:
sa.delete('https://***')
.set('Content-Type', 'application/json')
.send({"insured":"abc@gmail.com"})
.end((err,res)=>{});
答案 1 :(得分:1)
在我看来,就像您将相同的数组放在最外面的数组的所有三个点中一样。 尝试使用循环为每一行创建一个新数组。
let size = 3;
let g = new Array(size);
for (var i = 0; i < size; i++) {
g[i] = new Array(size).fill(0);
}
答案 2 :(得分:0)
您正在引用一个对象。根据{{3}}:
当fill方法传递一个对象时,它将复制引用 并用对该对象的引用填充数组。
const foo = new Array(3).fill(0);
let g = new Array(3).fill(foo);
console.log(JSON.stringify(g, null, 4));
foo[1] = 1; //g[1][1] = 1;
console.log(JSON.stringify(g, null, 4));
您将无法使用fill
来填充数组,必须将其分为2个步骤。
function cloneFill(arr, val, start = 0, end = arr.length) {
for (let i = start; i < end; i++) {
arr[i] = val.slice(0);
}
}
const foo = new Array(3).fill(0);
let g = new Array(3);
cloneFill(g, foo);
console.log(JSON.stringify(g, null, 4));
g[1][1] = 1;
console.log(JSON.stringify(g, null, 4));
答案 3 :(得分:0)
let g = new Array(3);
很好。这不是最佳做法,但是可以。您有一个包含3个空条目的数组。如果你这样做
g.fill("foo");
您将获得["foo", "foo", "foo"]
。貌似还不错。但是相反,您正在创建一个新对象:
g.fill(new Array(3));
您会认为new Array(3)
会被调用3次,但不会。而是一次创建一次,然后将其应用于数组中的每个条目。因此,g
中的每个索引都指向完全相同的对象。因此,更改该对象的属性将反映在g
中的每个索引上。
更好的做法是简单地使用循环来实例化n次数组,或显式地实例化它们:
let g = [];
for(var i = 0; i < 3; i++) {
g[i] = [0, 0, 0];
}
或者:
let g = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];