为什么结果为[[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);
答案 0 :(得分:0)
您的代码将m * n次相加row
。 row
被推送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));