Простой для циклов, простых массивов, совершенно непонятный вывод - PullRequest
0 голосов
/ 11 октября 2019

У меня есть очень простой вложенный цикл для заполнения 2-мерного массива (смысл в том, чтобы заполнить таблицу значениями условно). Результаты более чем неожиданны, и я не могу увидеть или найти свою ошибку.

Я не понимаю, почему все массивы заполнены (таблицы [0] и [1] должны быть пустыми, циклы начинаются только с2) и почему все заполнены одинаково. Файл console.log во внутреннем if показал, что эта часть кода выполняется только тогда, когда она должна, и выдает ожидаемый результат, что означает, что присваивание происходит только с теми, которые проверены как правильные значения. Еще до того, как внутренний цикл для R + 1 даже запущен, таблица [R + 1] уже заполнена содержимым таблицы [R].

По сути (отладка console.log) ошибочно заполненные поля никогда не присваиваются моим кодом, но заполняются. Также перезаписывает другие значения.

Наблюдается в Node.js и консоли Chrome, не пробовал другие среды выполнения.

Код:

const table = (new Array(7)).fill(new Array(7));
for (let R = 2; R <= 6; R++) {
  for (let N = 2; N <= 6; N++) {
    if (R + N <= 8) {
      table[R][N] = '' + R + N;
    }
  }
}

ожидаемый результат:

[
[ , , , , , , ],
[ , , , , , , ],
[ , , '22', '23', '24', '25', '26' ],
[ , , '32', '33', '34', '35', ],
[ , , '42', '43', '44', , ],
[ , , '52', '53', , , ],
[ , , '62', , , , ]
]

Фактический результат:

[
[ , , '62', '53', '44', '35', '26' ],
[ , , '62', '53', '44', '35', '26' ],
[ , , '62', '53', '44', '35', '26' ],
[ , , '62', '53', '44', '35', '26' ],
[ , , '62', '53', '44', '35', '26' ],
[ , , '62', '53', '44', '35', '26' ],
[ , , '62', '53', '44', '35', '26' ],
]

1 Ответ

0 голосов
/ 11 октября 2019

Оказывается, я был идиотом и должен был иметь RTFM. Если Array.fill () получает объект, он сохраняет ссылку.

...