搜索数组:TypeError:无法读取未定义的属性
2021-03-31
79
我是初学者,请原谅我,我已经搜索过了,但找不到任何可以帮助我解决这个基本问题的东西。
我有一个以数组形式存在的网格,该网格位于名为“cells”的数组中,其中填充了 1 和 0,分别代表活细胞和死细胞。对于网格上的每个位置,我想搜索它周围的 8 个位置。我使用 for 循环执行此操作:
//iterate through the whole board
for (y = 0; y < cells.length; y++) {
for (x = 0; x < cells[0].length; x++) {
let liveNeighbours = 0;
let deadNeighbours = 0;
//iterate through neighbours in 9 cell grid, ignore the cell itself
for (yy = y - 1; yy <= y + 1; yy++) {
for (xx = x - 1; xx <= x + 1; xx++) {
if (yy !== y || xx !== x) {
if (typeof(cells[yy][xx]) !== 'undefined') {
if (cells[yy][xx] === 1) {
liveNeighbours++;
} else if (cells[yy][xx] === 0) {
deadNeighbours++;
}
}
}
}
}
console.log('Looking at cell ' + x + ', ' + y);
console.log('Live neighbours ' + liveNeighbours);
console.log('Dead neighbours ' + deadNeighbours);
}
}
}
}
这似乎是最简单的方法,尽管显然这意味着搜索偶尔会查看未定义的数组索引(cells[-1][-1])。我尝试通过实施 typeof 检查来解决这个问题,但仍然收到错误:
TypeError:无法读取未定义的属性“-1”
它拒绝检查 typeof 因为 它是未定义的,即使这正是我想要知道的。我在这里做错了什么?
2个回答
也许有更好的方法:
cells[yy]?.[xx]
使用
可选链接
运算符。如果
cells[yy]
或
cells[yy][xx]
为
undefined
,则将返回 undefined。
这样,您根本不需要那个
if
包装器,因为
undefined !== 1
和
undefined !== 0
。
旧代码:
if (typeof(cells[yy][xx]) !== 'undefined') {
if (cells[yy][xx] === 1) {
liveNeighbours++;
} else if (cells[yy][xx] === 0) {
deadNeighbours++;
}
}
新代码:
if (cells[yy]?.[xx] === 1) {
liveNeighbours++;
} else if (cells[yy]?.[xx] === 0) {
deadNeighbours++;
}
编辑: 我可以使用可选链接运算符吗? (是的,IE 除外)
2021-04-01
您已经非常接近了。问题是,当
yy
超出范围时,
typeof(cells[yy][xx]) !== "undefined"
将不起作用,因为它将尝试访问
undefined
的下标。
将其更改为
if (typeof cells[yy] !== "undefined" && typeof cells[yy][xx] !== "undefined")
Barmar
2021-04-01