循环二维数组时,如何更改找到的特定值?

时间:2019-05-01 22:05:40

标签: javascript

尝试替换数组中数组的值。 该数组只有值1或0,它是一个网格。 代码正在寻找1并将其更改为0,还将下面一行的相同列值更改为1。

我相信问题是我要使if语句对我要进行的更改无效。导致出现错误消息。

function gravity() {
  for (var i = 0; i < rows; i++) {
    for (var j = 0; j < cols; j++) {
      if (grid[i][j] === 1){
        grid[i][j] = 0;
        grid[i+1][j] = 1;
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

问题在于,当循环位于最后一行时,它将尝试将i+1设置为1,但是由于i已经是最后一个索引i+1越界。

要解决此问题,您只需添加一个if

您还有另一个错误。由于您从上到下进行插入,因此将任何1向下移动到下一行,然后遍历下一行并找到与您刚刚向下移动并再次向下移动它们完全相同的1。重复此过程,直到所有1都消失了,一次调用gravity()。要解决此问题,您必须从下到上遍历所有行。

var grid = [
  [1,0,0,0],
  [0,0,1,0],
  [0,0,0,0],
  [0,1,0,0]
]

var cols = 4;
var rows = 4;

function gravity() {
  for (var i = rows - 1; i >= 0; i--) {
    for (var j = 0; j < cols; j++) {
      if (grid[i][j] === 1){
        grid[i][j] = 0;
        if(i+1 < rows) {
          grid[i+1][j] = 1;
        }
      }
    }
  }
}

var iterations = 0;

var intervalId = setInterval(() => {
  gravity();
  for(var row of grid) {
    console.log(row.join(','))
  }
  console.log("");
  iterations++;
  if(iterations == 4) {
    clearInterval(intervalId);
  }
}, 400)