JS:不能使用嵌套for循环赋值给嵌套数组



我得到一个" TypeError: Cannot set property '0' of undefined"从这个snipet代码。有人能帮我吗?非常感谢

let array = [[]];
function generateField(width, height) {
for (let i = 0; i < height; i++) {
for (let j = 0; j < width; j++) {
array[i][j] = Math.floor(Math.random() * 3);
};
};
console.log(array);
return array;
}
generateField(5, 5);

数组声明不应该是:let array = [][]而不是let array = [[]]吗?

您只需要在尝试插入到第二层之前初始化数组。

let array = [];
function generateField(width, height) {
for (let i = 0; i < height; i++) {
if(!array[i]) array[i] = [];
for (let j = 0; j < width; j++) {
array[i][j] = Math.floor(Math.random() * 3);
};
};
console.log(array);
return array;
}
generateField(5, 5);

请考虑这些提示

  • 不要使用array作为变量名,因为它可能在某些浏览器中产生错误
  • 因为JavascriptArray基本上是链表,所以没有必要这样声明Arraylet array = [[]]。当然更合适的是创建新的Array,并将其推送到现有的Array
  • 也许在generateField函数中声明let array = [[]]以使其更可重用,因为看看你的代码,我看到你想要的函数创建新的Arrayn行和m列随机数字,当let array = [[]]在外部时,你的函数将被修改每次当你调用generateField

工作代码如下:

function generateField(width, height) {
let rows = []
for (let i = 0; i < height; i++) {
let columns = []
for (let j = 0; j < width; j++) {
columns.push(Math.floor(Math.random() * 3))
}
rows.push(columns)
};
return [...rows] // create a copy of `Array` named `rows`
}
let matrix = generateField(3, 4)
console.log(matrix)

Array(4) [ (3) […], (3) […], (3) […], (3) […] ]
​
0: Array(3) [ 0, 1, 2 ]
​
1: Array(3) [ 0, 2, 0 ]
​
2: Array(3) [ 1, 2, 2 ]
​
3: Array(3) [ 2, 1, 2 ]
​
length: 4
​
<prototype>: Array []

最新更新