无法在2d数组

时间:2015-10-05 11:33:03

标签: javascript

我知道这已被问过很多次,但我该如何解决这个问题?

我有一个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;类型错误

2 个答案:

答案 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);
}