Javascript Установка полного столбца многомерного массива - PullRequest
3 голосов
/ 29 мая 2020

Пытаюсь сделать игру на Javascript. Игровое поле инициализируется в двумерный массив с нулевым заполнением. Однако, когда я устанавливаю значение одной точки, весь столбец получает это значение. Я думаю, что это проблема с тем, как я инициализирую массив.

Метод 1

# initialization
gameState = Array(6).fill(Array(7).fill(0))

# later in the game
gameState[2][4] = 1

# results in complete 4th index column to be assigned the value 1, like so -
0: (7) [0, 0, 0, 0, 1, 0, 0]
1: (7) [0, 0, 0, 0, 1, 0, 0]
2: (7) [0, 0, 0, 0, 1, 0, 0]
3: (7) [0, 0, 0, 0, 1, 0, 0]
4: (7) [0, 0, 0, 0, 1, 0, 0]
5: (7) [0, 0, 0, 0, 1, 0, 0]

Метод 2

# initialization
let gameState = [];
for (let i=0; i<MAX_ROWS; i++) {
    let row = []
    for (let j=0; j<MAX_COLUMNS; j++) {
       row.push(0)
    }
    gameState.push(row);
}

# again similar assignment
gameState[2][4] = 1

# results in correct state of the array
0: (7) [0, 0, 0, 0, 0, 0, 0]
1: (7) [0, 0, 0, 0, 0, 0, 0]
2: (7) [0, 0, 0, 0, 1, 0, 0]
3: (7) [0, 0, 0, 0, 0, 0, 0]
4: (7) [0, 0, 0, 0, 0, 0, 0]
5: (7) [0, 0, 0, 0, 0, 0, 0]

Кто-нибудь, пожалуйста, объясните, что я делаю здесь неправильно ?

1 Ответ

3 голосов
/ 29 мая 2020

Ваша проблема довольно проста.

Array(6).fill(Array(7).fill(0))

Давайте объясним, что это делает.

Array(6)

создает дырявый массив с пространством для 6 элементов.

.fill(...)

заполнит эти 6 дыр тем, что вы указали в качестве аргумента.

Теперь возникает проблема ...

В Javascript аргументы оцениваются перед выполнением функции

Это означает (в данном случае, когда .fill(...) запускается только один раз) ваш код точно такой же, как:

const innerArray = [0,0,0,0,0,0,0];
gameState = Array(6).fill(innerArray);

Это означает, что он заполняет внешний массив один и тот же экземпляр массива 6 раз.

Вы хотите каждый раз создавать отдельные массивы. Вместо этого просто сделайте это:

gameState = [...Array(6)].map(() => [...Array(7)].map(() => 0))
...