开发者问题收集

搜索数组: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 !== 1undefined !== 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