Node.js:多维数组分配

时间:2018-07-12 16:56:59

标签: javascript node.js

我想使用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。

我想问:

  1. 创建和启动多维数组的正确方法是什么?
  2. 为多维数组元素分配值的正确方法是什么?

谢谢。

4 个答案:

答案 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]];