Рефакторинг функции многомерного массива в ES6

1

В настоящее время я собираю функцию в своем приложении и задаюсь вопросом, является ли theres более аккуратным способом написать это с ES6, а не использовать два для циклов.

Целью является создание многомерного массива для отслеживания координат x & y. Это прекрасно работает, но я надеюсь сделать его более аккуратным.

function setBoard() {
boardParts = new Array(tileCount);
for (let i = 0; i < tileCount; ++i) {
    boardParts[i] = new Array(tileCount);
    for (let j = 0; j < tileCount; ++j) {
        boardParts[i][j] = new Object();
        boardParts[i][j].x = tileCount - 1 - i;
        boardParts[i][j].y = tileCount - 1 - j;
    }
}
emptyLoc.x = boardParts[tileCount - 1][tileCount - 1].x;
emptyLoc.y = boardParts[tileCount - 1][tileCount - 1].y;
solved = false;
}

Цените любую помощь!

Спасибо

  • 2
    Даже в ES5 есть литералы объектов :-)
  • 0
    Кроме того, emptyLoc.x = emptyLoc.y = 0; - это всегда одно и то же?
Теги:
ecmascript-6
arrays
multidimensional-array
function

2 ответа

2

Если вы хотите перейти на ES6, вы можете использовать Array # from для генерации массивов:

const tileCount = 4;

const boardParts = Array.from({ length: tileCount }, (_, i) => 
  Array.from({ length: tileCount }, (_, j) => ({
    x: tileCount - 1 - i,
    y: tileCount - 1 - j
  }))
);

console.log(boardParts);
  • 1
    Хорошо, честно, в ES2015 есть что-то, что связано с этим. Я бы не сказал, что это улучшение обязательно, но ОП специально спросил ... :-)
  • 0
    @Bergi - спасибо за улов и редактирование.
Показать ещё 1 комментарий
1

Там нет ничего особенного в ES2015+, который помогает с этим (ну, кроме Array.from как указывает Ори Array.from, чего вы можете или не хотите), но есть несколько вещей, которые вы можете сделать, чтобы улучшить его, которые также были доступны в ES5, см. Комментарии:

function setBoard() {
    boardParts = []; // No need to create with initial 'length', generic arrays
                     // aren't really arrays, no pre-allocation necessary
    for (let i = 0; i < tileCount; ++i) {
        boardParts[i] = []; // See above
        for (let j = 0; j < tileCount; ++j) {
            boardParts[i][j] = {           // Object initializer rather than
                x: tileCount - 1 - i,      // 'new Object' and then prop
                y: tileCount - 1 - j       // assignment
            };
        }
    }
    emptyLoc.x = boardParts[tileCount - 1][tileCount - 1].x;
    emptyLoc.y = boardParts[tileCount - 1][tileCount - 1].y;
    solved = false;
}

Отдельно на вышесказанное: представленная функция ожидает найти boardParts, tileCount, emptyLoc и solved объявленную в содержащем контексте. Обычно это не идеальный вариант для функций, которые работают исключительно через побочные эффекты, если они не являются объектными инициализаторами какого-то...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню