#5 Методы reduce и every в lodash

poster
В этом уроке мы разберем как использовать методы reduce и every в lodash.
Понравилось? Поделитесь с друзьями!
Понравилось?
Поделитесь с друзьями!
Комментарии
Текст видео

Всем привет. Мы продолжаем знакомиться с lodash и сегодня мы разберем методы every и reduce.

Метод every отлично подходит, чтобы проверить а выполняют ли все елементы массива какое-либо условие. Давайте попробуем. Например напишем код который будет проверять все ли элемента массива булевого типа

_.every([true, 1, null, 'yes'], Boolean);

Первым аргументом у нас идет массив разных типов данных, а вторым - Boolean. Если мы выполним этот метод то получим false. Это значит, что не каждый елемент этого массива Boolean. Это достаточно удобно когда нужно проверить типы всех елементов в массиве. Но на самом деле это не самый частый юзкейс, который возникает.

Теперь давайте посмотрим на самый часто используемый вариант every в проектах. Например у нас есть массив юзеров и мы хотим проверить все ли они активны.

_.every([{name: 'Foo', isActive: true}, {name: 'Bar', isActive: true}], function (item) {
  return item.isActive == true;
});

Первым аргументом у нас идет массив обьектов, вторым итератор в котором мы возвращаем условие item.isActive === true. В результате выполнения у нас вывелось true, что означает, что каждый елемент массива имеет в себе isActive - true. Это достаточно удобно так как мы можем легко проверять, а действительно ли все юзеры активны.

Естественно этот код было бы неплохо немного порефакторить. Условие true у нас не нужно в return и мы можем его удалить.

_.every([{name: 'Foo', isActive: true}, {name: 'Bar', isActive: true}], function (item) {
  return item.isActive;
});

Как мы видим в результате ничего не изменилось и код все также работает.

И было бы неплохо еще немного порефакторить и добавить сокращенную форму записи.

_.every([{name: 'Foo', isActive: true}, {name: 'Bar', isActive: true}], {isActive: true})

Первым елементом идет массив, а вторым обьект с ключем isActive: true. Как мы видим этот код тоже отрабатывает правильно и проверяет, а действительно ли у нас все пользователи активны. Метод every очень удобный метод и я его использую достаточно часто.

Теперь давайте поговорим о reduce. Функция reduce используется в принципе не так часто как фильтр или мап. Функция reduce работает как аккумулятор. Она проходит по каждому елементу и накапливает результат с предыдущими вычислениями и сохраняет в переменную.

Например напишем функцию которая складывает все елементы массива

_.reduce([1,2,3], function (memo, item) {
  return memo + item;
}, 0)

Первым аргументом будет массив елементов, которые мы хотим сложить. Вторым аргументом будет функция с двумя аргументами. emo это как раз та переменная, где сохраняется результат предыдущего вычисления, а item - это текущий елемент. В return мы возвращаем memo + item. То есть мы складываем то, что мы сохранили в предыдущий раз с новым значением. Не забывайте что третьим параметром как раз и идет аккумулятор. Поэтому мы его указываем в 0.

В самом начале memo у нас равняется 0. Мы заходим в функцию и смотрим - первый елемент 1. Добавляем это значение в наш аккумулятор. И так до конца массива.

Если мы выполним этот код, то увидим, что в результате у нас вывелось 15. То есть сумма значение всех елементов массива 15.

Давайте попробуем пример по сложнее. Мы хотим пройти по массиву обьектов и из всех обьектов с именем foo собрать id и записать в массив.

_.reduce([{id: 1, name: 'foo'}, {id: 2, name: 'bar'}], function (memo, item) {
  if ( item.name === 'foo' ) {
    memo.push(item.id);
  }
  return memo;
}, []);

Внутри функции мы проверяем, что если имя обьекта foo, то мы пушим в memo item.id. Третьим аргументом указываем пустой массив. В итоге у нас получился массив в единицей, поскольку у нас только один обьект с именем foo.

На самом деле reduce используется не так часто как другие функции, но что он делает и зачем он нужен знать не помешает

На сегодня все, а в следующий раз мы разберем методы groupBy, sortBy.

Только зарегистрированные пользователи могут оставлять комментарии.  Войдите, пожалуйста.
Moe Green
11 месяцев назад
sugar way в lodash развращает - с ним можно быстро забыть нативные методы js ) а это плохо однозначно! ))
monsterlessons
11 месяцев назад
В javascript проблема в отсутствии нормальных нативных методов (как например в ruby). Да и в lodash их негусто. Советую посмотреть в сторону Ramda. У меня есть по ней серия уроков. https://monsterlessons.com/project/series/funkcionalnyj-javascript-i-ramda Там действительно достаточно методов для удобной разработки.
Moe Green
11 месяцев назад
Вы буквально слово в слово повторили мой ответ в одной из telegram-комнаток по js, когда на меня там напали с обвинениями, что я не true-пацан, если lodash использую )) Ramba - да, я видел Вашу вкуснятину по функциональному программированию )) Отложил на некоторое время в сторону - хочу досмотреть остальные Ваши уроки. Мне нравится стиль подачи Вашего материала - чувствуется, что Вы практикующий разработчик - приятно смотреть. Функциональное программирование - один из трендов наступающего 2018 года )
monsterlessons
11 месяцев назад
На здоровье) Рад, что вам нравится.
Moe Green
11 месяцев назад
знаменитый метод reduce() )