无法在2d数组中设置未定义的属性"0"

2 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);
}
Run Code Online (Sandbox Code Playgroud)

..在线给我类型Cannot set property '0' of undefined错误pathmap[upm_x][upm_y] = 0;

Álv*_*lez 7

尽管有foo[0][0]语法糖,但多维数组并不存在.您只需在其他数组中包含数组.一个结果是您无法在同一表达式中构建数组:

> var foo = [];
undefined
> foo[0][0] = true;
TypeError: Cannot set property '0' of undefined
Run Code Online (Sandbox Code Playgroud)

您需要先创建父数组:

> var foo = [];
undefined
> foo[0] = [];
[]
> foo[0][0] = true;
true
Run Code Online (Sandbox Code Playgroud)

您可以使用常规技术确定它是否存在,例如:

> var foo = [];
undefined
> typeof foo[0]==="undefined"
true
> foo[0] = true;
true
> typeof foo[0]==="undefined"
false
Run Code Online (Sandbox Code Playgroud)


T.J*_*der 5

我原以为pathmap[][]是一个语法错误,我很惊讶你没有看到一个.

在使用数组之前pathmap[upm_x],必须在pathmap[upm_x]以下位置创建数组:

pathmap[upm_x] = [];
Run Code Online (Sandbox Code Playgroud)

这将是你外围的第一行while,所以:

while (upm_x < map.length){
    pathmap[upm_x] = [];
    // ...
Run Code Online (Sandbox Code Playgroud)

请记住,JavaScript没有2D数组.它有数组数组.pathmap = []创建外部数组,但不在其中创建任何数组.


边注:

var upm_x = 0;
while (upm_x < map.length){
    // ...
    upm_x++;
}
Run Code Online (Sandbox Code Playgroud)

是一种容易出错的写作方式:

for (var upm_x = 0; upm_x < map.length; upm_x++){
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果您使用while,并且您有任何理由使用continue或者您有多个if分支,则很容易忘记更新循环变量.由于循环的控制变量是什么for是对,最好使用正确的构建工作.


附注2:

你的代码正在成为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);
}
Run Code Online (Sandbox Code Playgroud)