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

значение, которое вы возвращаете, используется как аккумулятор для следующего
       элемента в массиве).
          Другой пример  - вычислительная статистика. Давайте, например, вычислим
       среднее и дисперсию для набора данных.
                              .
       const  data  =  [ 3 . 3 ,  5 ,   7  2 ,   1 2 ,   4 ,   6 ,   1 0 . 3 ] ;
       11  Алгоритм  Дональда  Кнута  для  вычисления  дисперсии:  Искусство
       11  программирования,  том  2  .   Получисленные  алгоритмы,  3-е  изд .  2000  год
       const  stats  =  data . reduce (  ( a ,   х )   =>  {
               a  . N++;
               let  delta  =  х   - a  . mean;
               a . m ean  +=  delt / a . N ;
                            a
                                      n
               а . М 2  + =   delta* ( x   - a . m ea ) ;
               return  а ;
           } ,  {  N :   О ,   mean :  О ,   М 2   :  О  } ) ;
       if ( s tats . N   >  2 )    {
           stats . v ariance  =  stats . M 2  /  ( s tats . N     - l ) ;
           stats . stdev  =  Math . sqrt ( s tats . v arianc ) ;
                                              e

          И снова мы исцользуем объект как аккумулятор, поскольку необходимо несколь­
       ко  переменных (в  частности - mean и М2:  при желании вместо N мы могли бы ис­
       пользовать индексный аргумент минус один).
          Давайте рассмотрим еще один пример, демонстрирующий гибкость метода reduce
       при использовании аккумулятора, тип которого мы еще не применяли, - строки.
                                              e
       const  words  =  [ "Beachball " ,   "Rodeo" ,   "Ang l " ,
                                "
           "Aardvark" ,  "Xylophone ,   "NovemЬe " ,  "Chocolate " ,
                                           r
           " Р арауа " ,   "Uniform" ,  "Joker" ,  " C lover" ,  "Bali " ] ;
       const  longWords  =  words . r educe (  ( а ,   w }   =>  w . length>б  ?  а+"  " + w  :  а ,   " " }   . t ri ( } ;
                                                                              m
       11  longWords :  "Beachball  Aardvark  Xylophone  November  Chocolate  Uniform"
          Здесь мы используем строковый аккумулятор для получения единой строки, со­
       держащей все слова, которые состоят более чем из шести символов. В качестве са­
       мостоятельного упражнения попробуйте переписать его, используя вместо reduce
       методы filter и j o in (строковый метод). (Начните с ответа на вопрос "Почему не­
       обходимо вызвать trim после reduce?")
          Надеюсь, вам понравилась мощь метода reduce. Из всех методов обработки мас­
       сива этот является наиболее универсальным и мощным.


       Методы массива и уда           л е н н ы е

       и л и   еще н е   о п редел е н н ы е   элементы
          Зачастую  недопонимание  поведения  методов  массива  ведет  к  неправильным
       предположениям относительно обработки ими элементов, которые были удалены



                            Методы массива и удаленные или еще не определенные элементы   171
   165   166   167   168   169   170   171   172   173   174   175