我得到一个" 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
作为变量名,因为它可能在某些浏览器中产生错误 - 因为Javascript
Array
基本上是链表,所以没有必要这样声明Array
let array = [[]]
。当然更合适的是创建新的Array
,并将其推送到现有的Array
- 也许在
generateField
函数中声明let array = [[]]
以使其更可重用,因为看看你的代码,我看到你想要的函数创建新的Array
与n
行和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 []