Перевод статьи 10 JavaScript Utility Functions Made with Reduce.
Содержание
Многофункциональный инструмент reduce снова наносит удар.
В своей последней статье я предлагал вам повторить функционал некоторых наиболее часто используемых функций с использованием метода reduce()
. В этой статье мы рассмотрим то, как это сделал бы я, включая некоторые полезные дополнения, которые, надеюсь, будут вам тоже полезны!
Всего мы рассмотрим десять функций-утилит. Я надеюсь, что вы найдете удобными для использования в ваших проектах, и самое главное они реализованы с использованием метода reduce()
! В ходе работы я черпал вдохновение, изучая код библиотеки RamdaJS.
1. some
Параметры:
-
predicate
– функция, которая возвращаетtrue
илиfalse
. -
array
– список элементов для тестирования.
Описание:
Если функция predicate
возвращает true
для любого элемента из array
, то функция some
тоже возвращает true
. В противном случае — false
.
Реализация:
const some = (predicate, array) => array.reduce((acc, value) => acc || predicate(value), false);
Использование
const equals3 = (x) => x === 3; some(equals3, [3]); // true some(equals3, [3, 3, 3]); // true some(equals3, [1, 2, 3]); // true some(equals3, [2]); // false
2. all
Параметры:
-
predicate
– функция, которая возвращаетtrue
илиfalse
. -
array
– список элементов для тестирования.
Описание:
Если функция predicate
возвращает true
для каждого элемента, то all
возвращает true
. В противном случае — false
.
Реализация:
const all = (predicate, array) => array.reduce((acc, value) => acc && predicate(value), true);
Использование:
const equals3 = (x) => x === 3; all(equals3, [3]); // true all(equals3, [3, 3, 3]); // true all(equals3, [1, 2, 3]); // false all(equals3, [3, 2, 3]; // false
3. none
Параметры:
-
predicate
– функция, которая возвращаетtrue
илиfalse
. -
array
– список элементов для тестирования.
Описание:
Если функция predicate
возвращает false
для каждого элемента, то none
возвращает true
. В противном случае — false
.
Реализация:
const none = (predicate, array) => array.reduce((acc, value) => !acc && !predicate(value), false);
Использование:
const isEven = (x) => x % 2 === 0; none(isEven, [1, 3, 5]); // true none(isEven, [1, 3, 4]); // false none(equals3, [1, 2, 4]); // true none(equals3, [1, 2, 3]); // false
4. map
Параметры:
-
transformFunction
– функция, которая будет применяться для каждого элемента -
array
– список элементов для тестирования.
Описание:
Возвращает новый массив элементов, каждый из которых преобразован в соответствии с логигой функции transformFunction
.
Реализация:
const map = (transformFunction, array) => array.reduce((newArray, item) => { newArray.push(transformFunction(item)); return newArray; }, []);
Использование:
const double = (x) => x * 2; const reverseString = (string) => string .split('') .reverse() .join(''); map(double, [100, 200, 300]); // [200, 400, 600] map(reverseString, ['Hello World', 'I love map']); // ['dlroW olleH', 'pam evol I']
5. filter
Параметры:
-
predicate
– функция, которая возвращаетtrue
илиfalse
. -
array
– список элементов для тестирования.
Описание:
Возвращает новый массив. Если функция predicate
возвращается true
, то этот элемент добавляется в новый массив. В противном случае — исключается.
Реализация:
const filter = (predicate, array) => array.reduce((newArray, item) => { if (predicate(item) === true) { newArray.push(item); } return newArray; }, []);
Использование:
const isEven = (x) => x % 2 === 0; filter(isEven, [1, 2, 3]); // [2] filter(equals3, [1, 2, 3, 4, 3]); // [3, 3]
6. reject
Параметры:
-
predicate
– функция, которая возвращаетtrue
илиfalse
. -
array
– список элементов для тестирования.
Описание:
Аналог filter
, но с противоположным эффектом.
Если predicate
возвращается false
, этот элемент добавляется в новый массив. В противном случае — исключается.
Реализация:
const reject = (predicate, array) => array.reduce((newArray, item) => { if (predicate(item) === false) { newArray.push(item); } return newArray; }, []);
Использование:
const isEven = (x) => x % 2 === 0; reject(isEven, [1, 2, 3]); // [1, 3] reject(equals3, [1, 2, 3, 4, 3]); // [1, 2, 4]
7. find
Параметры:
-
predicate
– функция, которая возвращаетtrue
илиfalse
. -
array
– список элементов для тестирования.
Описание:
Возвращает первый элемент, который соответствует условиям заданным в функции predicate
. Если ни один элемент не соответствует, то возвращается undefined
.
Реализация:
const find = (predicate, array) => array.reduce((result, item) => { if (result !== undefined) { return result; } if (predicate(item) === true) { return item; } return undefined; }, undefined);
Использование:
const isEven = (x) => x % 2 === 0; find(isEven, []); // undefined find(isEven, [1, 2, 3]); // 2 find(isEven, [1, 3, 5]); // undefined find(equals3, [1, 2, 3, 4, 3]); // 3 find(equals3, [1, 2, 4]); // undefined
8. partition
Параметры:
-
predicate
– функция, которая возвращаетtrue
илиfalse
. -
array
– список элементов.
Описание:
partition
разбивает массив на две части в зависимости от результата выполнения функции predicate
. Если predicate
возвращает true
, элемент попадает в список № 1. В противном случае — в список 2.
Реализация:
const partition = (predicate, array) => array.reduce( (result, item) => { const [list1, list2] = result; if (predicate(item) === true) { list1.push(item); } else { list2.push(item); } return result; }, [[], []] );
Использование:
const isEven = (x) => x % 2 === 0; partition(isEven, [1, 2, 3]); // [[2], [1, 3]] partition(isEven, [1, 3, 5]); // [[], [1, 3, 5]] partition(equals3, [1, 2, 3, 4, 3]); // [[3, 3], [1, 2, 4]] partition(equals3, [1, 2, 4]); // [[], [1, 2, 4]]
9. pluck
Параметры:
-
key
– наименование ключа для выборки из объекта. -
array
– список элементов.
Описание:
Выбирает значение по заданному ключу у каждого элемента из входного массива. Возвращает новый массив, состоящий из выбранных значений.
Реализация:
const pluck = (key, array) => array.reduce((values, current) => { values.push(current[key]); return values; }, []);
Использование:
pluck('name', [{ name: 'Batman' }, { name: 'Robin' }, { name: 'Joker' }]); // ['Batman', 'Robin', 'Joker'] pluck(0, [[1, 2, 3], [4, 5, 6], [7, 8, 9]]); // [1, 4, 7]
10. scan
Параметры:
-
reducer
– функция редьюсер, которая применяется для всех элементов последовательности. Получает два параметра — аккумулятор (содержит результат предыдущей мтерации) и текущий элемент входного массива. -
initialValue
– начальное значение аккумулятора. -
array
– список элементов.
Описание:
Работает так же, как и reduce
, но в качестве результата возвращает не одно значение, а список, где каждое значение получается как результат вызова функции редьюсера для текущего элемента входного массива с сохранением итога выполнения предыдущей операции.
Реализация:
const scan = (reducer, initialValue, array) => { const reducedValues = []; array.reduce((acc, current) => { const newAcc = reducer(acc, current); reducedValues.push(newAcc); return newAcc; }, initialValue); return reducedValues; };
Реализация:
const add = (x, y) => x + y; const multiply = (x, y) => x * y; scan(add, 0, [1, 2, 3, 4, 5, 6]); // [1, 3, 6, 10, 15, 21] scan(multiply, 1, [1, 2, 3, 4, 5, 6]); // [1, 2, 6, 24, 120, 720]