← Назад к вопросам

Что возвращает Reduce?

2.0 Middle🔥 171 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Краткий ответ

Метод Array.prototype.reduce() возвращает одно итоговое значение, которое является результатом накопления (агрегации) всех элементов массива. Это значение может быть любого типа: число, строка, объект, массив или даже функция.

Подробное объяснение

Суть метода reduce() заключается в последовательной обработке каждого элемента массива для сведения его к единственному значению — аккумулятору. Это делает его мощнейшим инструментом для преобразования данных.

Синтаксис и основные параметры

array.reduce(callback(accumulator, currentValue, index, array), initialValue)
  • callback: Функция, выполняемая для каждого элемента.
    *   **accumulator** (аккумулятор): Накапливает результат вызовов. Это "память" операции.
    *   **currentValue** (текущий элемент): Обрабатываемый элемент массива.
    *   **index** (опционально): Индекс текущего элемента.
    *   **array** (опционально): Исходный массив.
  • initialValue (начальное значение, опционально): Значение, с которого стартует аккумулятор. Крайне рекомендуется всегда его задавать для избежания ошибок с пустыми массивами и для ясности кода.

Что именно возвращается? Примеры

Возвращаемое значение — это последнее состояние аккумулятора после обработки последнего элемента массива.

1. Возврат примитивного значения (число)

// Сумма всех чисел
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, num) => acc + num, 0);
console.log(sum); // Возвращает: 15 (число)

// Поиск максимального значения
const max = numbers.reduce((acc, num) => Math.max(acc, num), -Infinity);
console.log(max); // Возвращает: 5 (число)

2. Возврат строки

const words = ['Hello', ' ', 'world', '!'];
const sentence = words.reduce((acc, word) => acc + word, '');
console.log(sentence); // Возвращает: "Hello world!" (строка)

3. Возврат объекта

Частая и полезная практика — группировка элементов по какому-либо признаку.

const people = [
  { name: 'Alice', age: 25 },
  { name: 'Bob', age: 30 },
  { name: 'Charlie', age: 25 }
];

const groupedByAge = people.reduce((acc, person) => {
  const age = person.age;
  if (!acc[age]) {
    acc[age] = [];
  }
  acc[age].push(person);
  return acc;
}, {}); // Начальное значение — пустой объект

console.log(groupedByAge);
// Возвращает объект:
// {
//   25: [{ name: 'Alice', age: 25 }, { name: 'Charlie', age: 25 }],
//   30: [{ name: 'Bob', age: 30 }]
// }

4. Возврат массива (преобразование структуры)

// "Расплющивание" массива массивов
const nestedArrays = [[1, 2], [3, 4], [5]];
const flatArray = nestedArrays.reduce((acc, subArray) => acc.concat(subArray), []);
console.log(flatArray); // Возвращает: [1, 2, 3, 4, 5] (массив)

Важные нюансы возвращаемого значения

  1. Зависимость от initialValue:
    *   Если `initialValue` задан, первый вызов callback произойдет с `acc = initialValue`, а `currentValue` будет равен первому элементу массива.
    *   Если `initialValue` **не задан**, то `acc` будет равен *первому элементу массива*, а обработка начнется со *второго элемента*. Это может привести к ошибкам с пустыми массивами.

```javascript
const arr = [];
// Без initialValue — ОШИБКА "Reduce of empty array with no initial value"
// const bad = arr.reduce((acc, val) => acc + val);

// С initialValue — работает корректно
const good = arr.reduce((acc, val) => acc + val, 0); // Возвращает: 0
```

2. Иммутабельность аккумулятора: В рамках функционального программирования считается хорошей практикой не мутировать аккумулятор напрямую, а возвращать новое значение. Это делает код предсказуемым.

```javascript
// Плохо (мутация)
const badReduce = (arr) => arr.reduce((acc, obj) => {
  acc.total += obj.value; // Прямое изменение acc
  return acc;
}, { total: 0 });

// Хорошо (возврат нового значения)
const goodReduce = (arr) => arr.reduce((acc, obj) => ({
  total: acc.total + obj.value // Возвращается новый объект
}), { total: 0 });
```

Резюме

  • reduce() возвращает финальное значение аккумулятора.
  • Это значение — результат итеративной агрегации всего массива.
  • Тип возвращаемого значения полностью определяется логикой функции-редьюсера и initialValue. Это главная сила метода: он универсален.
  • Основные сценарии использования: вычисление суммы/произведения, конкатенация, группировка в объект, преобразование структур данных, композиция функций.
  • Всегда указывайте initialValue для надежности и читаемости кода.
Что возвращает Reduce? | PrepBro