javascript - 当我将数组值设置为 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"
}
}
}
}
}
}
解决方案
让我们先简化一下这个问题。您看到的实际错误是因为您正在访问proxy[A][B]
,其中proxy[A]
未定义,因此您得到Cannot set property B of undefined
.
想一想可以得到什么可能的值A
。A
在y + i
您的代码中。您正在y
从0
to循环proxy.length - 1
,并且您正在i
从-1
to循环1
。
因此,可能的范围y + i
将是-1
to 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"
}
推荐阅读
- google-apps-script - 下拉列表的 cardservice 和 additem:如何添加数组?
- postgresql - 如何在postgres中搜索以特殊字符开头的名称
- c - 如果我在内核中添加一个 while 循环,Qemu 会重新启动
- powershell - 从“.CSV”获取多个单元格值到 Powershell
- django - 如何使用 django 标签模板在前端显示类别?
- php - 当我在 php 中执行查询时,我得到:致命错误:未捕获的错误:调用 bool 上的成员函数 close()
- xamarin.forms - Xamarin 形式:Xamarin.Plugin.FilePicker 不适用于 ios
- python - 通过 id 将 NaN 向前填充到最后一个值,并在最后一个值之后再填充 2 次
- java - jOOQ 中的 UPDATE-FROM 子句在比较数据类型时抛出异常
- json - 如何以角度形式验证开始日期和结束日期