【问题标题】:How to iterate through a "box" in a two dimensional array如何遍历二维数组中的“盒子”
【发布时间】:2017-10-04 15:45:32
【问题描述】:

我正在尝试遍历二维数组,然后在 JavaScript 中遍历二维数组中每个元素周围的“框”。那是通过“上面的行”中的三个元素,元素所在的“行”中的三个元素,然后是元素所在的“行”的“下面”的三个元素。我遇到了关于什么的问题与字面的“边缘”案例有关。换句话说,我正在尝试遍历 (o) 周围的 x:

[[x, x, x, o],
 [x, (o), x, o], 
 [x, x, x, o]]

当 (o) 位于边缘时,这就是我试图迭代的内容:

[[(o), x, o, o],
 [x, x, o, o],
 [o, o, o, o]]

关于如何在 JavaScript 中执行此操作的任何想法?

这是我目前所拥有的:

//iterates through each cell
for(var i = 0; i < height; i++){
  for(var j = 0; j < width; j++){
    var counter = 0;
    //iterates through a box around each cell
    for(var k = i - 1; k <= i + 1; k++){
      for(var l = j - 1; l <= j + 1 ; l++){
          if(cells[k][l].status === "alive"){
            counter++;
          }
      }
    }

【问题讨论】:

  • 请添加你目前写的代码
  • 欢迎来到 SO。请使用tour 并特别阅读how-to-ask。向我们展示一些代码,您将获得更多帮助!
  • 谢谢!刚刚添加了一些代码
  • 如果kl 是 适当的维度,则不要进行cells[k][l] 检查。还是您希望边缘环绕?
  • 哦,哇,回想起来总是那么明显,谢谢。我不希望边缘包裹。

标签: javascript arrays for-loop multidimensional-array


【解决方案1】:

当 k >= height 或 l >= width 或 l 或 k 小于 0 时,您的代码将在两种极端情况下失败。要解决此问题,请在您使用的内部循环中要在元素周围迭代框,您可以再次使用 k &lt; heightl &lt; width 添加对边缘情况的检查。同样在 if 条件下,您可以检查 l &gt;= 0k &gt;= 0

for(var i = 0; i < height; i++){
  for(var j = 0; j < width; j++){
    var counter = 0;
    //iterates through a box around each cell
    for(var k = i - 1; k < height && k <= i + 1; k++){
      for(var l = j - 1; l < width && l <= j + 1 ; l++){
          if(l >= 0 && k >= 0 && cells[k][l].status === "alive"){
            counter++;
          }
      }
    }

【讨论】:

    【解决方案2】:

    您必须在迭代中考虑“限制”:如果您处于位置 0:0,则无法检查位置 -1:-1 或类似位置

    //iterates through each cell
    for (var i = 0; i < height; i++) {
      for (var j = 0; j < width; j++) {
        var counter = 0,
          fromX = i === 0 ? 0 : i - 1,
          toX = i === width ? i : i + 1,
          fromY = j === 0 ? 0 : j - 1,
          toY = j === height ? j : j + 1;
    
        //iterates through a box around each cell
        for (var k = fromX; k <= toX; k++) {
          for (var l = fromY; l <= toY; l++) {
            if (cells[k][l].status === "alive") {
              counter++;
            }
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-18
      • 2015-04-07
      • 2019-03-18
      • 2016-09-04
      • 1970-01-01
      相关资源
      最近更新 更多