【问题标题】:How to iterate only on part of 2D array in JavaScript?如何仅在 JavaScript 中迭代部分二维数组?
【发布时间】:2015-11-18 15:25:29
【问题描述】:

我有二维数组

var arr = [[0,  1,  2,  3,  4,  5],
           [6,  7,  8,  9,  10, 11],
           [12, 13, 14, 15, 16, 17],
           [18, 19, 20, 21, 22, 23],
           [24, 25, 26, 27, 28, 29],
           [30, 31, 32, 33, 34, 35]];

现在我们将其分成更小的部分,例如 2x2。如何仅迭代此数组的部分(块),例如:索引为arr[2][4]arr[2][5]arr[3][4]arr[3][5] 的项目?

编辑:

似乎这个问题不容易理解。我想遍历块。

var blocks = 9;
var output = '';
for( var block = 0; block < blocks; block++) { 
  // actual iteration over array
  for(var i = ... ) {
    for(var j = ... ) {
      output += arr[i][j] + ' ';
    }
  }
  console.log(output);
  output = '';
}

预期的输出是:

0 1 6 7
2 3 8 9
4 5 10 11
12 13 18 19
14 15 20 21
16 17 22 23
24 25 30 31
26 27 32 33
28 29 34 35

【问题讨论】:

  • blocks、blocks = 9等是什么意思?
  • blocks 是逻辑块的总数
  • 请定义一个逻辑块

标签: javascript arrays algorithm


【解决方案1】:

您需要嵌套for 循环。

var arr = [[0,  1,  2,  3,  4,  5],
       [6,  7,  8,  9,  10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35]];

function loopThrough() {
    for(int i = 0; i < arr.length; i++) {
        // this will give you arr[0], arr[1], etc.
        for(int j = 0; j < arr.length; j++) {
            // this will give you arr[0][0], arr[0][1], etc.
            console.log(arr[i][j]);
        }
    }
}

loopThrough();

如果您希望它仅循环最后 2 个,则设置 j] = arr[i].length-2

<script type="text/javascript">

var arr = [[0,  1,  2,  3,  4,  5],
       [6,  7,  8,  9,  10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35]];

function loopThrough() {
    for(var i = 0; i < arr.length; i++) {
        // this will give you arr[0], arr[1], etc.
        for(var j = arr[i].length-2; j < arr[i].length; j++) {
            // this will give you arr[0][0], arr[0][1], etc.
            console.log(arr[i][j]);
        }
    }
}

loopThrough();

</script>

【讨论】:

  • 这也需要偏移内循环,所以它只迭代最后两个位置。
  • @AdamKonieska,没看到。已更新我的答案
【解决方案2】:
function subblock_array(arr, startX, endX, startY, endY) {  
    var subArr = [];
    for (var ii=startX; ii<endX; ii++) {
        subArrY = [];
        for (var jj=startY; jj<endY; jj++) {
            subArrY.push(arr[ii][jj]);
        }
        subArr.push(subArrY);
    }
    return subArr;
}

subblock_array(arr, 2, 4, 4, 6)

【讨论】:

    【解决方案3】:

    您想按顺序访问这些索引:

    arr[0][0] arr[0][1] arr[1][0] arr[1][1]
    arr[0][2] arr[0][3] arr[1][2] arr[1][3]
    [...]
    arr[0][y-1] arr[0][y] arr[1][y-1] arr[1][y] // first two lines processed
    arr[2][0] arr[2][1] arr[3][0] arr[3][1]     // we continue with the next two lines
    [...]
    arr[2][y-1] arr[2][y] arr[3][y-1] arr[3][y]
    [...]
    arr[x-1][0] arr[x-1][1] arr[x][0] arr[x][1]
    [...]
    arr[x-1][y-1] arr[x-1][y] arr[x][y-1] arr[x][y]
    

    如您所见,我们有两个级别的迭代:第一个迭代行,跳过每隔一个,第二个迭代列,跳过一个。

    下面的代码应该实现这个:

    for (var x=0; x < arr.length; x+=2) {
      for (var y=0; y < arr[x].length; y+=2) {
        console.log(arr[x][y] + " " + arr[x][y+1] + " " + arr[x+1][y] + " " + arr[x+1][y+1]);
      }
    }
    

    您会注意到我们在每个循环中将迭代变量增加两个,因为内部块一次消耗两列和两行。

    【讨论】:

    • 这是我想要避免的——隐式设置 startX 和 startY。数组应该在逻辑上分成块。查看我的编辑。
    • @makbol 已编辑,这是一个展示结果的 JSFiddle:jsfiddle.net/LLjeq61t;如果解释不够清楚,请告诉我,我会尝试更新它
    • 到目前为止,您的答案最接近我想要实现的目标,但循环应该遍历块内的元素,而不是明确设置边界。
    • 抱歉,现在不能编辑。所以我希望:块 1 内的第一次迭代得到:arr[0][0],第二次:arr[0][1],第三次:arr[1][0],第四次:arr[1][1]。块 2 中的第一次迭代得到:arr[0][2],第二次:arr[0][3],第三次:arr[1][2],第四次:arr[1][3] ... 等等
    • @makbol 您需要定义边界,因为 javascript 没有逻辑块构造,因此您必须指定它们。提供的代码确实会循环这些项目,并且按照您说arr[0][0]、第二个arr[0][1] 等时要求的顺序。这正是代码正在做的事情。
    【解决方案4】:

    您需要一个带有偏移内部循环的循环来迭代最后两个位置。像这样的东西会起作用,你可以在这个 js fiddle 上看到结果:https://jsfiddle.net/0wfysb38/3/

    var arr = [[0,  1,  2,  3,  4,  5],
               [6,  7,  8,  9,  10, 11],
               [12, 13, 14, 15, 16, 17],
               [18, 19, 20, 21, 22, 23],
               [24, 25, 26, 27, 28, 29],
               [30, 31, 32, 33, 34, 35]];
    
    
    
    for(i = 0; i < arr.length - 1; i=i+2) {
        for(j = 0; j < arr[i].length - 1; j=j+2) {
            strOut = '';
            strOut = strOut + ', ' +arr[i][j];
            strOut = strOut + ', ' +arr[i][j+1];
            strOut = strOut + ', ' +arr[i+1][j];
            strOut = strOut + ', ' +arr[i+1][j+1];
            strOut = strOut.substring(1,strOut.length)
            console.log(strOut);
        }
    }
    

    编辑:更新代码以产生与预期输出匹配的结果。关键是将循环迭代 2,并通过偏移来寻找数组中的下一个位置。这不是很灵活,这个循环的数组应该有适当的结构。

    【讨论】:

    • 在这种方法中,您将遍历第 4、5 列。
    • @makbol 这是您在编辑帖子、迭代 [16,17]、[22,23] 等之前提出的要求。您现在想完成一些不同的事情吗?
    • 没有。您粘贴的小提琴的结帐结果。输出为 4, 5, 10, 11, 16, 17, 22, 23, 28, 29, 34, 35
    • @makbol,你在问你的问题'如何只迭代这个数组的一部分(块),例如:索引 arr[2][4]、arr[2][5 ],arr[3][4],arr[3][5]?这正是要退回的物品。您的预期输出 '0 1 6 7 2 3 8 9 4 5 10 11' 与您的要求不符。您要求迭代的项目与您的预期输出不匹配。
    • 是的。项目:arr[2][4]arr[2][5]arr[3][4]arr[3][5] 是逻辑 block 的一部分,因此它们将是 16 17 22 23
    猜你喜欢
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 2018-12-25
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    相关资源
    最近更新 更多