
Всем привет. Мы продолжаем знакомиться с 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.