Page 168 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 168

результатом сведения к единому значению может быть объект или другой массив -
       метод  reduce способен воспроизвести возможности функций map и  f i l  ter (и если
       на то пошло, любой другой рассмотренной здесь функции массива).
          Метод reduce, подобно map и  filter, позволяет предоставить функцию, которая
       контролирует результат. Прежде мы уже имели дело с функциями обратного вызова
       (callback), первый переданный им элемент всегда является текущим элементом мас­
       сива. Однако первое значение функции reduce - аккумулятор (accumulator), в ко­
       торый сводится массив. Остальная часть аргументов вполне ожидаема: текущий эле­
       мент массива, текущий индекс и сам массив.
          Помимо функции обратного вызова, методу reduce передается (необязательно)
       начальное значение для аккумулятора. Давайте рассмотрим простой пример - сум­
       мирование чисел в массиве.

       const  arr  =  [ 5 ,   7 ,   2 ,   4 ] ;
       const  sum  =  arr . reduce (  ( a ,   х )   => а  +  =  х ,   0 ) ;
          Передаваемая в  reduce функция получает два параметра: аккумулятор (а) и те­
       кущий элемент массива (х). В этом примере аккумулятор изначально содержит зна­
       чение О. Поскольку это наш первый опыт с reduce, рассмотрим все этапы, которые
       проходит JavaScript, чтобы лучше понять, как это работает.
          1 .   Для первого элемента массива (5) вызывается (анонимная) функция. Первона­
                                                                                 и
                                     а
             чальна, а имеет значение О,  х   - значение 5. Функция возвращает сумму а  х
             (5), что становится значением а на следующем этапе.
          2.  Функция вызывается для второго элемента массива (7). Т е перь а имеет значение
                                                               7
             5 (переданное с предыдущего этапа),  х   имеет значение  .   Функция возвращает
                                              а
             сумму а и  х    (12), которая становится значением а на следующем этапе.
          3.  Функция вызывается для третьего элемента массива (2). Т е перь а имеет значе­
                 1
             ние  2 ,   а  х    - значение 2. Функция возвращает сумму а и  х    ( 1 4 ) .
                                                                             (
          4.  Функция вызывается для четвертого, и последнего, элемента массива  4 ) . Те­
                                                   4
                                 1
                                                                                 и
             перь а имеет. значение  4 ,   а  х    - значение  .   Функция возвращает сумму а  х
             ( 1 8 ) ,   которая и будет возвращаемым значением функции reduce (которое за­
             тем присваивается константе sum).
          Проницательный читатель уже мог бы понять, что в этом очень простом примере
       мы даже не должны присваивать значение а; важнее всего то, что возвращается из
       функции (помните, что стрелочная нотация не требует явного оператора return),
       таким образом, мы можем просто возвращать а  +  х. Однако в более сложных при­
       мерах нам может понадобиться сделать с аккумулятором нечто большее. Таким об­
       разом, модификация аккумулятора в функции - это хорошая привычка.





                                                     Магия массивов: метод  reduce   1 6 9
   163   164   165   166   167   168   169   170   171   172   173