Когда я впервые узнал о функции сокращения в Javascript, я использовал ее для получения суммы чисел в массиве. Это казалось сложной функцией, но я понял, что она делает и как ее использовать таким образом. Однако теперь, когда я ежедневно погружаюсь в решение алгоритмов, я начал видеть новые способы использования того же метода, о возможности которого я даже не подозревал. Сегодня я хочу поговорить о некоторых из этих вариантов использования!

Функция редукции выполняет функцию редуктора, которую вы даете ей для каждого элемента массива. У него есть два аргумента. Первая — это функция обратного вызова, а вторая — начальное значение, с которого вы хотите начать. В случае получения суммы массива функция обратного вызова (accum, val) => accum + valдобавляет каждый элемент к предыдущему итогу, как показано в приведенном ниже коде. Второй аргумент указывает, с какого числа начинается сумма (0 в первом примере и 5 во втором).

let array = [1, 5, 10, 4]
let sum = array.reduce((accum, val) => accum + val, 0)
let sumTwo = array.reduce((accum, val) => accum + val, 5)
console.log(sum)
// 20
console.log(sumTwo)
// 25

Само по себе это довольно круто, но есть и другие способы использования сокращения, которые делают его еще более функциональным! Одно очень похожее использование — суммирование значений в массиве объектов. Это позволяет легко перемещаться по массиву объектов, чтобы найти общее значение определенного атрибута. В приведенном ниже примере предположим, что нам нужно сложить все возрасты для каждого человека в нашем массиве объектов.

let objects = [
  {name: "Andrew", age: 35},
  {name: "Susan", age: 60},
  {name: "Allen", age: 62}
]
let ageTotal = objects.reduce((accum, val) => accum + val.age, 0)
console.log(ageTotal)
// 157

Теперь начинается самое интересное. Допустим, теперь мы хотим отсортировать наш массив объектов на два массива по возрасту: до 55 лет в одном и 55 и выше в другом. Мы все еще можем использовать функцию сокращения! Для начала мы изменили бы наше начальное значение на объект, который мы хотели бы вернуть, но без добавленных значений. Затем мы будем использовать нашу функцию обратного вызова, чтобы определить, к какой категории мы добавляем текущий объект, и, наконец, просто вернуть аккумулятор (который является нашим теперь завершенным объектом). Найдите минутку, чтобы просмотреть код ниже.

let objects = [
  {name: "Andrew", age: 35},
  {name: "Susan", age: 60},
  {name: "Allen", age: 62}
]
// set up our returned object the way we want it returned
let initialValue = {
  young: [],
  old: []
}
// call reduce on our objects, use the callback function to sort the objects and use our initialValue object to start
let sortedByAge = objects.reduce((accum, val) => {
  val.age >= 55 ? accum.old.push(val) : accum.young.push(val)
  return accum
}, initialValue)
// If we look at our sortedByAge object we see two objects in our old array (Susan and Allen) and one object in our young array (Andrew)
// We quickly sorted through our objects and classified them based on their attributes which is extremely helpful 
// sortedByAge =
// {
 young: [
  { name: "Andrew", age: 35}
 ],
 old: [
  {name: "Susan", age: 60},
  {name: "Allen", age: 62}
 ]
}

Мы также можем передать третий аргумент нашей функции обратного вызова для индекса, если нам нужно отслеживать текущий индекс.

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