origami1024
@origami1024
went out for a night walk

Откуда путаница в массивах?

let newArray = [];
let row = [];
for (let i = 0; i < 3; i++) {
    for (let j = 0; j < 2; j++) {
      row.push(0);
    }
    console.log(row)//видим, что сначала 2 элемента, потом 4, потом 6
    newArray.push(row);
  }
console.log(newArray);

Получается
[ [ 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0 ] ]

А не
[[ 0, 0 ],
[ 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0 ]]

Почему?
  • Вопрос задан
  • 100 просмотров
Решения вопроса 1
deMone
@deMone
Техдиректор — tech-director.ru
Потому что массив row передаётся по ссылке в массив newArray, то есть каждый раз, когда вы пишете newArray.push(row), вы не фиксируете текущее состояние row в newArray, а делаете ссылку на одну и ту же переменную row, которую в дальнейшем меняете.

Чтобы проверить этот тезис, можете запустить например вот такой код:
let a = [1, 2];
let b = [a, a];
console.log(b); // [[1, 2], [1, 2]]
a.push(3); // теперь изменим a и окажется
console.log(b); // [[1, 2, 3], [1, 2, 3]]


Если вы хотите, чтобы в ключах newArray было три разных состояния массива row, используйте например функцию slice:
let newArray = [];
let row = [];
for (let i = 0; i < 3; i++) {
    for (let j = 0; j < 2; j++) {
      row.push(0);
    }
    console.log(row)//видим, что сначала 2 элемента, потом 4, потом 6
    newArray.push(row.slice()); // функция slice() без аргументов возвращает копию массива, на котором применена
  }
console.log(newArray);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы