在 Javascript 中重写动态条件语句

Rewrite dynamic conditional statement in Javascript

我正在构建一个网格,其中新项目必须适合下一个可用位置。项目可以是 3:2 或 2:3,网格是 12 列宽。

如何重写这个循环条件语句以删除硬编码限制并接受 3:2 或 2:3(当前为 x:3,y:2)的输入?

        const check = (
            !grid[rowY + 0][columnX + 0] &&  // @TODO: Hard coded limit
            !grid[rowY + 0][columnX + 1] &&  // @TODO: Hard coded limit
            !grid[rowY + 0][columnX + 2] &&  // @TODO: Hard coded limit
            !grid[rowY + 1][columnX + 0] &&  // @TODO: Hard coded limit
            !grid[rowY + 1][columnX + 1] &&  // @TODO: Hard coded limit
            !grid[rowY + 1][columnX + 2]     // @TODO: Hard coded limit
        );
        if (check) {
            openX = columnX;
            openY = rowY;
            found = true;
        }
        return found;

对于网格检查,您可以使用循环来迭代您的键。

如果需要检查整个网格,只需将循环限制设置为相应数组的长度即可。

下面是一个带有硬编码限制的示例:

function unknown() {
  const check = (function() {
    var c = true;
    for (let y = 0; y <= 2; y++) {
      for (let x = 0; x <= 3; x++) {
        c = !grid[rowY + 0][columnX + 0];
        if (!c) {
          return c;
        }
      }
    }
    return c;
  })();
  if (check) {
    openX = columnX;
    openY = rowY;
    found = true;
  }
  return found;
}

如果你觉得舒服,你可以使用 ES6,你可以使用 Array.prototype.some 来获得更漂亮的代码:

var grid = [
  [true, true, true, true],
  [true, true, true, true],
  [true, true, true, true],
  [true, true, false, true],
  [true, true, true, true],
];
var openX = null;
var openY = null;
var found = grid
  .some((x, xi) => {
    return x
      .some((y, yi) => {
        if (!y) {
          openX = xi, openY = yi;
        }
        return !y;
      });
  });
console.log(found, openX, openY);

您可以使用everysome数组方法。给定 widthheight 的值,您可以按如下方式动态计算 check

const check = !grid.slice(rowY, rowY + height).some( row =>
    row.slice(columnX, columnX + width).some(Boolean)
);