Следующей функцией для работы с массивами, которую мы рассмотрим,
будет функция reduce.
Это, пожалуй, одна из самых гибких и одна из самых сложных
для понимания функций для работы с массивами.
Но будьте внимательны, и она вам во многом пригодится.
Итак, эта функция, так же как и другие функции для работы с массивами,
принимает на вход в качестве первого параметра функцию обратного вызова,
а в качестве второго параметра — так называемый аккумулятор и его начальное
значение для вашей обработки данных.
Что происходит далее?
Функция обратного вызова вызывается,
в качестве первого параметра мы каждый раз получаем значение аккумулятора.
А в качестве второго параметра мы получаем элемент массива,
на котором мы сейчас находимся.
После этого на каждом новом шаге мы должны обработать значение из аккумулятора,
то есть предыдущее значение, которое было ранее, что-то с ним сделать.
В данном случае мы хотим посчитать сумму лайков,
которые есть в нашем массиве из объектов твитов, и просуммировать их,
чтобы посчитать суммарное количество лайков в нашей ленте.
Мы берем целое число из нашего объекта,
на котором мы сейчас находимся, и добавляем его к нашему аккумулятору,
возвращая это значение из нашей функции обратного вызова.
Таким образом, на каждом шаге цикла, начиная с 0,
мы прибавляем значение количества лайков внутри нашего текущего
элемента к нашему аккумулятору и возвращаем новое значение из аккумулятора.
И пройдя по всему массиву, мы посчитаем суммарное количество лайков
в виде целого числа и вернем его из функции reduce.
Но в качестве начального значения может быть не только целое число,
может быть произвольный тип данных.
Это может быть, например, массив.
Для чего это может быть полезно?
Например, мы хотим взять наш массив с твитами и выбрать из него все хештеги,
которые есть в нашей ленте.
Для этого мы будем на каждой итерации нашей
операции reduce добавлять к этому массиву, изначально пустому,
хештеги, которые находятся в текущем элементе на текущей итерации.
А если у текущего элемента нет хештегов, то это будет пустой массив.
После этого мы конкатенируем наш
текущий аккумулятор с этим массивом и возвращаем его.
Таким образом, на каждом шаге мы добавляем новые хештеги из текущего элемента
на текущем шаге итерации в наш аккумулятор и возвращаем обновленный аккумулятор.
После этого мы получим один большой массив,
который будет сочетать все хештеги из нашего изначального массива с объектами.
Далее, мы можем использовать объект в
качестве начального значения для аккумулятора.
Для чего это может быть полезно?
Например, мы хотим посчитать статистику использования тех или иных
хештегов в нашей ленте.
И в качестве начального объекта, от которого мы будем плясать,
мы возьмем уже схлопнутый, соединенный воедино массив со всеми хештегами.
И в качестве элемента в данном случае будет выступать
текущий хештег в массиве, который будет являться строчкой.
Что мы делаем дальше?
На вход, как мы помним,
в аккумулятор мы передаем в качестве начального значения пустой объект.
Далее, у этого объекта мы проверяем наличие свойства,
которое является нашим текущим хештегом.
И если такового свойства нет,
то мы инициируем это свойство у нашего объекта с нулевым значением.
После этого мы суммируем для каждого элемента
объекта по имени хештега наш счетчик.
Таким образом, в конце, пройдя все шаги итерирования,
мы посчитаем количество использований каждого хештега внутри
нашей ленты и вернем его каждый раз из
нашей функции обратного вызова в качестве аккумулятора.
И так же, как с map,
filter или forEach можно использовать reduce в качестве цепочек.
И мы можем взять изначальное значение, в нашем случае твиты,
сначала схлопнуть их в один большой массив,
состоящий только из хештегов, а потом посчитать по нему статистику.
И в качестве результата мы получим нашу статистику в виде
объекта со счетчиком по каждому хештегу.
Опять-таки код получается разделенный, аккуратный,
каждая функция выполняет свое независимое действие.
А в следующей лекции мы рассмотрим дополнительные методы для работы
со строчками и с массивами, для которых у нас не хватило времени в основной части.