Page 169 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 169
Прежде чем мы перейдем к более интересным случаям применения метода
reduce, давайте рассмотрим, что будет, если аккумулятору не присваивается на
чальное значение, т.е. он равен unde f i ned. Тогда метод reduce считает первый
элемент массива в качестве начального значения и начинает вызывать функцию
со вторым элементом. Давайте вернемся к нашему примеру, но опустим начальное
значение.
const arr [ 5 , 7, 2 , 4 ) ;
const sum arr . reduce ( а , х ) => а += х ) ;
(
1 . Для второго элемента массива 7 ) вызывается (анонимная) функция. У а те
(
7
а
перь начальное значение 5 (первый элемент массива), х содержит значение .
Функция возвращает сумму а и х ( 1 2 ) , что становится значением а на следу
ющем этапе.
2. Функция вызывается для третьего элемента массива (2). Т е перь а имеет на
а
чальное значение 12, х - значение 2. Функция возвращает сумму а х ( 1 4 ) .
и
4
3. Функция вызывается для четвертого, и последнего, элемента массива ( ) . Т е
1
перь а имеет значение 4 , х а - значение 4 . Функция возвращает сумму а и х
( 1 8 ) , которая и становится возвращаемым значением reduce (оно затем при
сваивается константе sum).
Как можно заметить, здесь на один этап меньше, но результат то же. В этом при
мере (и в любом другом случае, когда первый элемент может служить начальным
значением аккумулятора) мы можем извлечь пользу, исключив начальное значение.
Обычно для метода reduce в качестве аккумулятора используется значение ба
зового типа (число или строка), но использование для аккумулятора объекта - это
очень мощный подход (о котором часто забывают). Например, если у вас есть мас
сив строк и вы хотите сгруппировать строки в упорядоченные по алфавиту массивы
(слова на А, слова на Б и т.д.), можете использовать объект.
const words = [ " Beachball" , "Rodeo" , "Ang l " ,
e
r
r
"Aardva k " , "Xylophone" , "NovemЬe " , "Chocolate" ,
а
"Рарау " , "Uniform" , "Joker" , "Clover" , "Bali " ] ;
const alphabetical = words . reduce ( ( a , х ) => {
if ( ! a [ x [ O ] J ) a [ x [ O J J = [ ] ;
а [х 0 ] ] . p ush х ) ;
(
[
return а ; } , { } ) ;
Этот пример немного сложнее, но принцип тот же. Для каждого элемента
в массиве функция проверяет аккумулятор на наличие у него свойства для пер
вой буквы в слове; если его нет, она добавляет пустой массив (когда она встре
чает " B eachb l l " и никакого свойства . В нет, она создает для него пустой мас
a
а
сив). Затем она добавляет слово в соответствующий массив (который, возможно,
)
был только что создан , и наконец аккумулятор (а) возвращается (помните, что
1 7 0 Глава 8. Массивы и их обработка

