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. Массивы и их обработка
   164   165   166   167   168   169   170   171   172   173   174