在 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);
您可以使用every
或some
数组方法。给定 width
和 height
的值,您可以按如下方式动态计算 check
:
const check = !grid.slice(rowY, rowY + height).some( row =>
row.slice(columnX, columnX + width).some(Boolean)
);
我正在构建一个网格,其中新项目必须适合下一个可用位置。项目可以是 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);
您可以使用every
或some
数组方法。给定 width
和 height
的值,您可以按如下方式动态计算 check
:
const check = !grid.slice(rowY, rowY + height).some( row =>
row.slice(columnX, columnX + width).some(Boolean)
);