我知道这已被问过很多次,但我该如何解决这个问题?
我有一个map [] []数组(包含游戏的tile id),我需要将它复制到pathmap [] []数组(只包含0和1,它是一个路径图),但是当我这样做..
function updatepathmap(){
pathmap = [];
var upm_x = 0;
while (upm_x < map.length){
var upm_y = 0;
while (upm_y < map[upm_x].length){
pathmap[][]
if (canPassthrough(map[upm_x][upm_y])) {
pathmap[upm_x][upm_y] = 1;
} else {
console.log(upm_x);
console.log(upm_y);
pathmap[upm_x][upm_y] = 0;
}
upm_y++;
}
upm_x++;
}
console.log(map);
console.log(pathmap);
}
..它在Cannot set property '0' of undefined
行
pathmap[upm_x][upm_y] = 0;
类型错误
答案 0 :(得分:7)
尽管有foo[0][0]
句法糖,但多维数组并不存在。您只需在其他数组中包含数组。一个结果是你不能在同一个表达式中构建数组:
> var foo = [];
undefined
> foo[0][0] = true;
TypeError: Cannot set property '0' of undefined
您需要先创建父数组:
> var foo = [];
undefined
> foo[0] = [];
[]
> foo[0][0] = true;
true
您可以使用常规技术确定它是否存在,例如:
> var foo = [];
undefined
> typeof foo[0]==="undefined"
true
> foo[0] = true;
true
> typeof foo[0]==="undefined"
false
答案 1 :(得分:5)
我原以为pathmap[][]
是语法错误,我很惊讶你没有看到。
在pathmap[upm_x]
使用数组之前,您必须在pathmap[upm_x]
创建一个数组:
pathmap[upm_x] = [];
这将是您的while
外部的第一行,所以:
while (upm_x < map.length){
pathmap[upm_x] = [];
// ...
请记住,JavaScript没有2D数组。它有数组数组。 pathmap = []
创建外部数组,但不会在其中创建任何数组。
旁注:
var upm_x = 0;
while (upm_x < map.length){
// ...
upm_x++;
}
是一种容易出错的写作方式:
for (var upm_x = 0; upm_x < map.length; upm_x++){
// ...
}
如果您使用while
,并且您有任何理由使用continue
或者您有多个if
分支,则很容易忘记更新循环变量。由于循环控制变量是 for
用于,因此最好使用正确的构造来完成作业。
旁注2:
您的代码正在成为The Horror of Implicit Globals的牺牲品,因为您没有声明pathmap
。也许你是故意这样做的,但我不推荐它。声明你的变量,如果你需要它在你的函数之外,让你的函数返回它。
旁注3:
map
会使这段代码变得更简单:
function updatepathmap(){
var pathmap = map.map(function(outerEntry) {
return outerEntry.map(function(innerEntry) {
return canPassthrough(innerEntry) ? 1 : 0;
});
});
console.log(map);
console.log(pathmap);
}