Рубрики
JS

JS метод массива reduce с примерами

Метод массива reduce применяет к массиву переданную в него функцию и возвращает одно итоговое значение.

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

В свою очередь функция может принимать 4 значения:

  • Аккумулятор
  • Текущий элемент массива
  • Текущий индекс
  • Массив

Если в методе reduce не передать аккумулятор, то он примет значение первого элемента массива. А текущий элемент в свою очередь примет значение второго элемента массива.

Пример: сумма элементов массива с помощью reduce

Для наглядности разберем пример, с выводом промежуточных шагов.

data = [1, 2, 3, 4, '5'];

console.log("Пример, когда аккумулятор задан")
data.reduce(function test(acc, currentItem, index, array) {
    console.log("Аккумулятор:", acc, "Текущий элемент:", currentItem, "Текущая позиция:", index);
    return acc + currentItem;
}, 0)

console.log()
console.log("Пример, когда аккумулятор НЕ задан");
data.reduce(function test(acc, currentItem, index) {
    console.log("Аккумулятор:", acc, "Текущий элемент:", currentItem, "Текущая позиция:", index);
    return acc + currentItem;
})

Получаем следующий результат:

Пример, когда аккумулятор задан
Аккумулятор: 0 Текущий элемент: 1 Текущая позиция: 0
Аккумулятор: 1 Текущий элемент: 2 Текущая позиция: 1
Аккумулятор: 3 Текущий элемент: 3 Текущая позиция: 2
Аккумулятор: 6 Текущий элемент: 4 Текущая позиция: 3
Аккумулятор: 10 Текущий элемент: 5 Текущая позиция: 4

Пример, когда аккумулятор НЕ задан
Аккумулятор: 1 Текущий элемент: 2 Текущая позиция: 1
Аккумулятор: 3 Текущий элемент: 3 Текущая позиция: 2
Аккумулятор: 6 Текущий элемент: 4 Текущая позиция: 3
Аккумулятор: 10 Текущий элемент: 5 Текущая позиция: 4

Мы получили сумму элементов массива с помощью метода reduce.

В первом случае, мы задали начальное значение аккумулятора. А во втором случае не указывали, получилось на одну итерацию меньше, но результат такой же.

Пример 2: задача на собеседовании по использованию метода reduce

Задачу взял из этой статьи

задача на собеседовании по использованию метода reduce

На данном этапе моего обучения, мне кажется самым удачным такое решение:

data = [1, 2, 3, 4, '5'];

console.log()
console.log("Сумма или конкатенация");
let result = data.reduce(function sumNumberOrString(acc, currentItem, index) {
    console.log("Аккумулятор:", acc, "Текущий элемент:", currentItem, "Текущая позиция:", index);
    return acc + currentItem;
}, acc = data.every(item => typeof item === 'number') ? 0 : "")
console.log(result);

Результат с выводом промежуточных шагов

Сумма или конкатенация
Аккумулятор:  Текущий элемент: 1 Текущая позиция: 0
Аккумулятор: 1 Текущий элемент: 2 Текущая позиция: 1
Аккумулятор: 12 Текущий элемент: 3 Текущая позиция: 2
Аккумулятор: 123 Текущий элемент: 4 Текущая позиция: 3
Аккумулятор: 1234 Текущий элемент: 5 Текущая позиция: 4
12345

Так как в JS динамическая типизация, то сумма будет считаться в зависимости от типа переменной.

Я проверяю являются ли все элементы числами и в зависимости от этого, задаю начальное значение аккумулятора

acc = data.every(item => typeof item === 'number') ? 0 : "")

Буду рад любой обратной связи в комментариях)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *