Уменьшить армейский нож, метод на стероидах?

Метод JS Reduce часто сводится (каламбур) к методу, возвращающему одно значение, которое является истинным, но где он не соответствует определению одного значения, обычно считается, что это какое-то примитивное значение, такое как сумма чисел или строка символов . больше того, что на самом деле я называю это методом на стероидах.

Просто чтобы мы были на одной странице, давайте разберем метод сокращения на более простые термины. MDN определяет сокращение как «Метод reduce() выполняет функцию reducer (которую вы предоставляете) для каждого элемента массива, в результате чего получается одно выходное значение».

const array1 = [1, 2, 3, 4];
const reducer = (accumulator, currentValue) => accumulator + currentValue;
// 1 + 2 + 3 + 4
console.log(array1.reduce(reducer));
// expected output: 10
// 5 + 1 + 2 + 3 + 4
console.log(array1.reduce(reducer, 5));
// expected output: 15

Метод Reduce принимает 4 параметра

  1. Аккумулятор
  2. Текущая стоимость
  3. Текущий индекс
  4. Исходный массив

Ради наших объяснений мы можем просто остановиться на первых двух и попытаемся расшифровать их в более простых терминах. Накопитель, как следует из названия, накапливает результирующее значение, которое возвращается в конце с помощью явного использования ключевого слова «return». текущее значение ссылается на метод сокращения текущего элемента. если накопитель не указан, метод reduce возьмет первый элемент из массива, присвоит его переменной-аккумулятору и вообще пропустит первый элемент.

const nums = [1, 2, 3, 4, 5, 6];
const total = nums.reduce((acc, value) => {
  console.log("Current value: ", value);
  // more code //
});
// logs 
Current value:  2
Current value:  3
Current value:  4
Current value:  5
Current value:  6

Поскольку я не предоставил второй параметр, метод сокращения взял первое значение и присвоил его переменной acc и пропустил его, чтобы начать со второго значения. давайте сделаем базовое сложение, используя сокращение.

const nums = [1, 2, 3, 4, 5, 6];
const total = nums.reduce((acc, value) => {
  return acc + value;
});
console.log('total is: ', total)
logs out
// total is:  21

Для каждой итерации значение acc добавляется к текущей переменной «value» и возвращается обратно, что, в свою очередь, становится значением аккумулятора для следующей итерации, и так продолжается до тех пор, пока не будут пройдены все элементы.

Итак, что же такое стероидная часть, проще говоря, метод сокращения можно использовать как все стандартные методы ES2015, такие как карта, фильтр и т. д.

1. Reduce as Map: lets Square each element
const nums = [1, 2, 3, 4, 5, 6];
const squared = nums.reduce((acc, value) => {
  return acc.push(value**2)
}, []);
console.log(squared)
logs out
// [ 1, 4, 9, 16, 25, 36 ]
2. Reduce as filter: lets filter even numbers
const nums = [1, 2, 3, 4, 5, 6];
const evenNumbers = nums.reduce((acc, value) => {
  if (value % 2 === 0) acc.push(value);
  return acc;
}, []);
console.log(evenNumbers);
logs out
// [ 2, 4, 6 ]
3. Reduce as find: lets find "4" in array
const nums = [1, 2, 3, 4, 5, 6];
const findFour = nums.reduce((acc, value) => {
  if (value === 4) acc.push(value);
  return acc;
}, []);
console.log(findFour);
logs out
// [ 4 ]
4. Reduce as every: lets see if nums are mulitpler of 1. 
const nums = [1, 2, 3, 4, 5, 6];
const every = nums.reduce((acc, value) => {
  if (1 * value !== value) acc = false;
  return acc;
}, true);
console.log(every);
logs out
// true
5. Reduce as some: lets see any number is even
const nums = [1, 2, 3, 4, 5, 6];
const some = nums.reduce((acc, value) => {
  if (acc) return acc;
  if (value % 2 === 0) acc = true;
  return acc;
}, false);
console.log(some);
logs out
// true

Как мы видим, мы можем использовать метод сокращения, чтобы делать практически все, что угодно по сравнению с его аналогами ES2015, он не ограничен возвратом какого-либо конкретного значения, такого как массив, в случае метода карты или фильтра. вы можете присвоить любое значение аккумулятору, обработать его и использовать в любом типе, который вы пожелаете.

Заключение

Я едва коснулся поверхности истинной силы метода «уменьшения», точно так же, как швейцарский армейский нож, он может делать много вещей, но не обязательно то, на что вы хотели бы положиться в своих проблемах. для большинства вещей существует лучшая сборка метода ES2015 для более эффективной обработки, и она не предназначена для использования в качестве замены. как, с тем, что сказал дядя Бен "с большой силой приходит, большая ответственность". это не статья о том, как побудить людей отказаться от всех других методов ES2015 в пользу «сокращения». это просто мой другой взгляд на то, что такое сокращение и как на это следует смотреть.