首页 > 解决方案 > 当我将数组值设置为 0 以外的任何值时,它返回“未捕获的类型错误:无法设置未定义的属性“1 - 15””

问题描述

我目前正在尝试制作地图生成器,但在我随机设置要着陆的部分中,如果我将它们设置为 0 或“”以外的任何值,它会返回

“未捕获的类型错误:无法设置未定义的属性“1 - 15””

(它不返回“1-15”,它只是在运行时返回一个介于 1 和数组长度(即 15)之间的数字)

//lets every block surrounding a land peice have a 1 in 3 chance of making more land
for(let y = 0; y < proxy.length; y++){
    for(let x = 0; x < proxy[y].length; x++){
        if(proxy[y][x] != 0){

            for(let i = -1; i <= 1; i++){
                for(let j = -1; j <= 1; j++){

                    let run = Math.floor(Math.random() * 3)

                    if(run == 0){
                        proxy[y + i][x + j] = "o"
                    }

                }
            }   

        }
    }
}

(完整代码) https://jsfiddle.net/2q9rz38x/1/

标签: javascriptarrayshtml5-canvas

解决方案


让我们先简化一下这个问题。您看到的实际错误是因为您正在访问proxy[A][B],其中proxy[A]未定义,因此您得到Cannot set property B of undefined.

想一想可以得到什么可能的值AAy + i您的代码中。您正在y0to循环proxy.length - 1,并且您正在i-1to循环1

因此,可能的范围y + i将是-1to proxy.length。在两个方向上都比应有的多 1 项!(你会同意这proxy[-1]可能是未定义的,同样适用于proxy[proxy.length]......)

当然也是如此x + j,但这不会引发错误,因为它只会在proxy[something][-1]例如处写入新属性,这可能不是预期的,但它是有效的 JavaScript。

因此,您要么必须更改循环,要么限制值。由于这是固定大小地图上的地图生成器,我猜想限制结果更合乎逻辑。所以,你会做这样的事情:

if (
  y + i >= 0 &&
  y + i < proxy.length &&
  x + j >= 0 &&
  x + j < proxy[y + i].length
) {
  proxy[y + i][x + j] = "o"
}

...或者,或者:

if ((y + i) in proxy && (x + j) in proxy[y + i]) {
  proxy[y + i][x + j] = "o"
}

推荐阅读