Перевод статьи 10 JavaScript Utility Functions Made with Reduce.

Многофункциональный инструмент reduce снова наносит удар.

В своей последней статье я предлагал вам повторить функционал некоторых наиболее часто используемых функций с использованием метода reduce(). В этой статье мы рассмотрим то, как это сделал бы я, включая некоторые полезные дополнения, которые, надеюсь, будут вам тоже полезны!

Всего мы рассмотрим десять функций-утилит. Я надеюсь, что вы найдете удобными для использования в ваших проектах, и самое главное они реализованы с использованием метода reduce()! В ходе работы я черпал вдохновение, изучая код библиотеки RamdaJS.

1. some

Параметры:

  1. predicate – функция, которая возвращает true или false.
  2. 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

Параметры:

  1. predicate – функция, которая возвращает true или false.
  2. 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

Параметры:

  1. predicate – функция, которая возвращает true или false.
  2. 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

Параметры:

  1. transformFunction – функция, которая будет применяться для каждого элемента
  2. 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

Параметры:

  1. predicate – функция, которая возвращает true или false.
  2. 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

Параметры:

  1. predicate – функция, которая возвращает true или false.
  2. 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

Параметры:

  1. predicate – функция, которая возвращает true или false.
  2. 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

Параметры:

  1. predicate – функция, которая возвращает true или false.
  2. 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

Параметры:

  1. key – наименование ключа для выборки из объекта.
  2. 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

Параметры:

  1. reducer – функция редьюсер, которая применяется для всех элементов последовательности. Получает два параметра — аккумулятор (содержит результат предыдущей мтерации) и текущий элемент входного массива.
  2. initialValue – начальное значение аккумулятора.
  3. 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]

Оставить комментарий