Maria Sorokina

Здравствуйте! Вопрос по теории. Очень туплю в этом месте, просто поняла, что так надо делать, но до конца не совсем пониманию:

const x = arr.reduce((acc, value) => [value, ...acc], []);

почему так, со спредом аккумулятора, код работает, а если прямо в аккумулятор пушить нет:

const x = arr.reduce((acc, value) => acc.push(value), []);
TypeError: acc.push is not a function

мы же в обоих случаях передаем в аккумулятор пустой массив.....

5 0

Приветствую, Мария!

Тут дело в том, что функция reduce на каждой итерации работает со значением аккумулятора, который был возвращён на предыдущей итерации. В первом случае: (acc, value) => [value, ...acc] функция возвращает массив, и он будет новым значением аккумулятора. А во втором случае: (acc, value) => acc.push(value) функция возвращает результат вызова метода push. А вызов данного метода возвращает новую длину массива, и это уже число. Поэтому на следующей итерации возникнет ошибка, так как в acc содержится число, и попытка на числе вызвать метод push приведёт к ошибке. Порекомендую вам посмотреть в документации какое значение возвращает метод push.

0

Станислав Дзисяк, спасибо, действительно, пример с push абсолютно некорректный. Получается, что без использования spread оператора никак не обойтись, если хочется использовать функции высшего порядка....

0

Мария, приветствую!

Ну спред, в данном случае самый простой способ, но есть и альтернативы. Например, можно использовать метод concat, если требуется вернуть массив к которому нужно добавить элемент.

0

Станислав Дзисяк, спасибо за ответы!

0

Пожалуйста, Мария :)

0

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

Кирилл Шаповал 09 января 2020 →

Где почитать про динамическое определение свойств? Пока только понял, что [propertyName] - это единственный...

Evgeny Zhdanov 10 ноября 2019 →

У меня все никак в голове не укладывается. То сложность нарастает и кажется, что ты умственно отсталый, то...

Таня Титаева 03 ноября 2019 →

Добрый вечер! Можете объяснить, что делают выделенные фигурные скобки? ({...acc, [selector(elem)]: elem}), {}

Alexander 31 октября 2019 →

Как отличить rest от spread ? Например, func(...args) ?

Степан Шидловский 31 октября 2019 →

Добрый день, вопрос по отладке. почему это - console.log(ELEMENT---${elem}); выдает это - ELEMENT---[objec...

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Javascript, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →