Вы можете сделать рекурсивный вызов со значением, полученным из getAdjacentCells
. Однако, обязательно позвоните getAdjacentCells
только один раз для того же id
. Теперь это совершенно неэффективно, поскольку вы повторяете тот же вызов.
См. Также некоторые другие предложения в коде.
function isCellEmpty(adjacentCells) {
// I would move this check here, although not necessary if you prefer it in the loop.
if (typeof adjacentCells === "number") {
$("#" + id).empty().append("<div>"); // You can chain jQuery...
return;
}
for (let id of adjacentCells) { // Just use a for..of loop
if (id === null) continue; // keep IF-ELSE nesting flat.
let cell = board[getBoardPosition(id)];
if (cell.opened) continue; // Add this to avoid circling around
cell.opened = true;
isCellEmpty(getAdjacentCells(id)); // recursive call
}
}
Object.values
Вы пишете в комментарияхвашего кода, который:
getAdjacentCells () вернет либо массив объектов, аналогичный тому, который функция принимает в качестве аргумента, либо целое число
Однако ваши комментарииниже этот ответ, кажется, предполагает, что это не (всегда) так. Это может быть простой объект, который объясняет, почему вы использовали Object.values
для его итерации. Если это так, я хотел бы изменить getAdjacentCells
, чтобы он действительно возвращал массив. Или, если это невозможно, используйте Object.values
, как вы уже сделали:
function isCellEmpty(adjacentCells) {
// I would move this check here, although not necessary if you prefer it in the loop.
if (typeof adjacentCells === "number") {
$("#" + id).empty().append("<div>"); // You can chain jQuery...
return;
}
for (let id of Object.values(adjacentCells)) { // Just use a for..of loop
if (id === null) continue; // keep IF-ELSE nesting flat.
let cell = board[getBoardPosition(id)];
if (cell.opened) continue; // Add this to avoid circling around
cell.opened = true;
isCellEmpty(getAdjacentCells(id)); // recursive call
}
}