【问题标题】:why is there three of these [0][0][0][0][0][0] when i console.log matrix?当我使用 console.log 矩阵时,为什么会有这三个 [0][0][0][0][0][0] ?
【发布时间】:2021-01-03 15:51:47
【问题描述】:

好的,所以我只想简单解释一下为什么我的控制台中有三个 [0][0][0][0][0][0] 在一个更大的数组中,而不仅仅是一个?我的问题可能与嵌套的 for 循环有关,所以如果你们能准确解释这里发生的事情,我将不胜感激。

function zeroArray(m, n) {
  // Creates a 2-D array with m rows and n columns of zeroes
  let newArray = [];
  let row = [];
  for (let i = 0; i < m; i++) {
    // Adds the m-th row into newArray

    for (let j = 0; j < n; j++) {
      // Pushes n zeroes into the current row to create the columns
      row.push(0);
    }
    // Pushes the current row, which now has n zeroes in it, to the array
    newArray.push(row);
  }
  return newArray;
}

let matrix = zeroArray(3, 2);
console.log(matrix);

【问题讨论】:

  • 将 let row = ... 下移一行,到循环的内部。
  • 您没有意识到的是您只有一个子数组,并且将同一数组的引用多次推送到外部数组中。尝试matrix[0][0] = 1 会看到所有子数组都获得该值,因为它们实际上是同一个数组对象的实例
  • 嗨,我的回答怎么样?

标签: javascript console.log nested-for-loop


【解决方案1】:

因为您一直在使用相同的row 数组。只需在每个循环上创建一个新的 row 数组即可。

function zeroArray(m, n) {
  let newArray = [];
  for (let i = 0; i < m; i++) {
    let row = []; // Create the row inside the loop, so on each iteration a new row is created
    for (let j = 0; j < n; j++) {
      row.push(0);
    }
    newArray.push(row);
  }
  return newArray;
}

let matrix = zeroArray(3, 2);
console.log(matrix);

【讨论】:

    【解决方案2】:

    这是使用 Array.from() 及其内部映射回调和新 Array 构造函数以及 Array#fill() 的一个很好的用例

    function zeroArray(m, n) {
      // Creates a 2-D array with m rows and n columns of zeroes
      return Array.from({length: m}, () => new Array(n).fill(0))
    }
    
    let matrix = zeroArray(3, 2);
    console.log(matrix);

    【讨论】:

    • 很好的答案,但我认为 OP 没有从中学到任何东西。
    • @JorgeFuentesGonzález 这似乎是一个愚蠢的声明,原因有几个。首先,SO 答案是针对长期知识库的,而不是专门针对 OP 的。其次,即使他们不完全了解这种方法的工作原理,他们也可以阅读文档以获得更多理解,并且通常只了解更简单的方法可以帮助您沿着学习曲线前进,即使您不准备立即使用它们
    • 我只是说,至少解释他为什么失败,正如问题和问题的内容所问的那样。
    猜你喜欢
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 2020-03-19
    相关资源
    最近更新 更多