在这种情况下如何执行嵌套循环?

时间:2020-01-26 00:14:12

标签: javascript

为什么结果为[[0,0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]] ?

该代码如何执行?原因不是那么直观。

function zeroArray(m, n) {
  let newArray = [];
  let row = [];
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      row.push(0);
    }
    newArray.push(row);
  }
  return newArray;
}
let matrix = zeroArray(3, 2);
console.log(matrix);

1 个答案:

答案 0 :(得分:0)

您的代码将m * n次相加rowrow被推送m次进入新的数组

在您将其添加到row后添加到newArray的事实,并不意味着row被神奇地清除了

要证明每一行中的数组相同,请考虑以下代码

function zeroArray(m, n) {
  let newArray = [];
  let row = [];
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      row.push(0);
    }
    newArray.push(row);
  }
  return newArray;
}
let matrix = zeroArray(3, 2);
matrix[0][0]=1;
console.log(JSON.stringify(matrix));

查看更改[0][0]也会如何更改[1][0][2][0]-这是因为每一行都是完全相同的数组

注意:在下面的解决方案中,我添加了matrix[0][0] = 1以证明上面的问题不存在,即每一行是一个不同的数组-显然,您不应该在该行中包含该行实际代码

两个简单的解决方案:1-按下后设置row = []

function zeroArray(m, n) {
  let newArray = [];
  let row = [];
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      row.push(0);
    }
    newArray.push(row);
    row = [];
  }
  return newArray;
}
let matrix = zeroArray(3, 2);
matrix[0][0]=1;
console.log(JSON.stringify(matrix));

解决方案2:在第一个循环内声明行

function zeroArray(m, n) {
  let newArray = [];
  for (let i = 0; i < m; i++) {
    let row = [];
    for (let j = 0; j < n; j++) {
      row.push(0);
    }
    newArray.push(row);
  }
  return newArray;
}
let matrix = zeroArray(3, 2);
matrix[0][0]=1;
console.log(JSON.stringify(matrix));

和现代解决方案

function zeroArray(m, n) {
  return Array.from({length: m}).map(() => Array(n).fill(0));
}
let matrix = zeroArray(3, 2);
matrix[0][0]=1;
console.log(JSON.stringify(matrix));