Почему код так работает?

149
14 декабря 2019, 06:50
return Array(n).fill(Array(n).fill(0)).map(($arrV, $i) => {$arrV.splice($i,1,1);

я хочу чтобы выводил что то похожее: [[1,0,0,0,0],[0,1,0,0,0],[0,0,1,0,0], [0,0,0,1,0], [0,0,0,0,1]]

а он заполняет все массивы единицами. Почему?

Answer 1

fill ()

Метод fill() заполняет все элементы массива от начального до конечного индексов одним значением.

Одним – в смысле одним и тем же (в оригинале static value). То есть

Array(n).fill(Array(n).fill(0))

равносильно следующему:

const x = Array(n).fill(0); Array(n).fill(x)

Из чего немедленно следует, что все элементы результата ссылаются на одно и то же, единственное значение.

const f = n => Array (n).fill (Array (n).fill (0)), a = f (2) 
 
console.log (a) 
 
console.assert (a [0] !== a [1])

Поэтому код в map на каждом проходе изменяет один и то же массив, что вы и имеете неудовольствие наблюдать.

Решить можно по-разному, например так:

const f = n => Array.from ({length: n}, () => Array (n).fill (0)).map ((a, i) => (a [i] = 1, a)) 
 
console.log (f (3))

Answer 2

Вот так Array(n).fill(Array(n)) Вы заполняете первый массив одним и тем же экземпляром массива 2

Вот рабочий сниппет:

let n = 5; 
let mat = Array(n).fill(0).map(($arrV, $i) => Array(n).fill(0).fill(1, $i, $i+1)); 
console.log(mat)

Answer 3

Дело в том, что каждый ваш подмассив в массиве имеет одинаковую ссылку друг на друга, в результате чего, изменяя любой из них, вы изменяете и все остальные. Чтобы создать независимые подмассивы используйте метод Array.from().

Рабочий пример:

let arr = Array(5).fill(Array(5).fill(0));
arr = arr.map(value => {
  return Array.from(value);
});
arr.map((value, k) => {
  return value.splice(k, 1, 1);
});
READ ALSO
Как работает оператор цикла for в JS?

Как работает оператор цикла for в JS?

Кто-то может, так скажем, "разжевать" его по пунктам?

119
Не могу сделать запрос к mysql, который посчитает количество записей

Не могу сделать запрос к mysql, который посчитает количество записей

Со связыванием таблиц не могу никак разобраться, сложно все для меня пока чтоВ общем делаю форум

114
Поиск элемента с ценой больше 100

Поиск элемента с ценой больше 100

Как мне пропарсить элемент с ID=BETS и достать все числа из data-worth со всех элементов и если моё число больше добавить выше этого элемента мой элементесли...

130