【问题标题】:How to create a 2-D array initialized with zeroes in JavaScript? [duplicate]如何在 JavaScript 中创建一个用零初始化的二维数组? [复制]
【发布时间】:2020-11-01 04:00:53
【问题描述】:

今天我将我的 Python 代码移植到 JavaScript 中,发现了这种行为。

代码:

var a = new Array(2).fill(new Array(3).fill([0, 0]));
for (i=0; i<2; i++) {
  for (j=0; j<3; j++) {
    a[i][j] = [i, j];
    //console.table(a); //for debugging
  }
}

我认为a 应该得到什么(作为二维数组):

--------------------------
[0, 0] | [0, 1] | [0, 2] |
--------------------------
[1, 0] | [1, 1] | [1, 2] |
--------------------------

JavaScript 给了我什么:

--------------------------
[1, 0] | [1, 1] | [1, 2] |
--------------------------
[1, 0] | [1, 1] | [1, 2] |
--------------------------

看起来 JavaScript 中使用了一些其他类型的逻辑,而不是我认为的。我只是将[i, j] 分配给[i][j]-th 条目,但结果不是我想要的。

  1. 我的代码有误吗?
  2. 为什么 for 循环逻辑在 JavaScript 中不起作用?
  3. 那我应该怎么做才能得到想要的结果呢?

【问题讨论】:

  • 如何打印出数组内容?
  • 因为您使用的是Array.filla[1] 是对a[0] 的引用,所以当您更改a[1][0] 时,您也会更改a[0][0]
  • 请参阅this question,了解如何正确创建空二维数组。
  • 关键是.fill()不会用内部数组的copies填充外部数组,而是引用同一个single数组.

标签: javascript arrays loops for-loop


【解决方案1】:

如果我们运行:

let a = new Array(2).fill(new Array(3).fill([0, 0]));
for (let i=0; i<2; i++) {
  for (let j=0; j<3; j++) {
    a[i][j] = [i, j];
    console.log(a[i][j]);
  }
}
console.log(a);

我们发现循环的逻辑本身没有问题。 ij 的顺序正确。所以有什么问题?原来是JavaScript的Array.fill()方法creates copies by references, not values!换句话说,每个元素基本上都是指向同一个数组的引用,而不是单独的单独数组。要为您的代码解决此问题,请使用 Array.from():

let a = Array.from({length: 2}, e => Array.from({length:3}, e => [0, 0]));
for (let i=0; i<2; i++) {
  for (let j=0; j<3; j++) {
    a[i][j] = [i, j];
    console.log(a[i][j]);
  }
}
console.log(a);

【讨论】:

    【解决方案2】:

    您也可以简单地执行此操作,而无需创建带有零的数组(除非您需要该带有零的数组)。对数组使用push 方法。

    let arr = [];
    let nrows = 2;
    let ncols = 3;
    
    for (let i=0; i<nrows; i++) {
      for (let j=0; j<ncols; j++) {
        arr.push([i,j]);
      }
    }
    
    console.log(arr);
    

    【讨论】:

      猜你喜欢
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 2021-04-04
      相关资源
      最近更新 更多