Может кто-нибудь объяснить, что происходит с `push` здесь?

#javascript #node.js

#javascript #node.js

Вопрос:

Такое ощущение push , что он ведет себя забавно. Вместо того, чтобы просто нажимать на 1 индекс внутри forEach , кажется, что он нажимает на все 3 индекса. Я упускаю что-то очевидное?

  let arrayToReduce = [ [ 1, 2, 3 ] ]
    let reduced = arrayToReduce.reduce((arr, inner) => {
      const copied = arr.slice()
      inner.forEach((num, idx) => {
        copied[idx].push(num)
      })
      return copied
      }, Array(arrayToReduce[0].length).fill([]))

    console.log(reduced) 

Ожидаемый результат: [[1], [2], [3]]

Фактический результат: [[1, 2, 3], [1, 2, 3], [1, 2, 3]]

Ответ №1:

push это не виновник, это так fill .

Вы создали массив той же длины, что и исходный, а затем заполнили его значением.

Это значение представляет собой массив.

Тот же самый массив.

Поэтому, когда вы вводите значение copied[0] , вы получаете ссылку на этот массив и помещаете в него значение.

И когда вы вводите значение copied[1] , вы получаете ссылку на тот же массив и помещаете в него другое значение.

Ответ №2:

     let arr = [ [ 7, 3, 47 ] ]
    let reduced = arr.flat().map(e=>[e])
    console.log(reduced) 
 

// вывод: [[7], [3], [47]]

если вы хотите получить ожидаемый результат : [[1], [2], [3]]

Просто верните индекс вместо элемента во внутреннем массиве

     let arr = [ [ 7, 3, 47 ] ]
    let reduced = arr.flat().map((e,i)=>[i 1])
    console.log(reduced)