Spec-Zone.ru › JavaScript

TypeError: Reduce of empty array with no initial value

JavaScript-исключение "reduce of empty array with no initial value" возникает при использовании функции reduce.

Сообщение

TypeError: Reduce of empty array with no initial value (V8-based & Firefox & Safari)

Тип ошибки

TypeError

Что пошло не так?

В JavaScript есть несколько функций reduce:

  • Array.prototype.reduce(), Array.prototype.reduceRight() и
  • TypedArray.prototype.reduce(), TypedArray.prototype.reduceRight()).

Эти функции необязательно принимают initialValue (который будет использоваться в качестве первого аргумента для первого вызова callback). Однако, если начальное значение не предоставлено, в качестве начального значения будет использоваться первый элемент Array или TypedArray. Эта ошибка возникает, когда передается пустой массив, потому что в этом случае невозможно вернуть начальное значение.

Примеры

Некорректные случаи

Эта проблема часто возникает в сочетании с фильтром (Array.prototype.filter(), TypedArray.prototype.filter()), который удалит все элементы списка. Таким образом, не останется ни одного элемента, который можно было бы использовать в качестве начального значения.

const ints = [0, -1, -2, -3, -4, -5];
ints
  .filter((x) => x > 0) // removes all elements
  .reduce((x, y) => x + y); // no more elements to use for the initial value.

Аналогично, та же проблема может возникнуть, если в селекторе есть опечатка или неожиданное количество элементов в списке:

const names = document.getElementsByClassName("names");
const nameList = Array.prototype.reduce.call(
  names,
  (acc, name) => `${acc}, ${name}`,
);

Корректные случаи

Эти проблемы можно решить двумя способами.

Один из способов — предоставить initialValue в качестве нейтрального элемента оператора, например, 0 для сложения, 1 для умножения или пустую строку для конкатенации.

const ints = [0, -1, -2, -3, -4, -5];
ints
  .filter((x) => x > 0) // removes all elements
  .reduce((x, y) => x + y, 0); // the initial value is the neutral element of the addition

Другой способ — обработать пустой случай либо до вызова reduce, либо в обработчике после добавления неожиданного фиктивного начального значения.

const names = document.getElementsByClassName("names");

let nameList1 = "";
if (names.length >= 1) {
  nameList1 = Array.prototype.reduce.call(
    names,
    (acc, name) => `${acc}, ${name}`,
  );
}
// nameList1 === "" when names is empty.

const nameList2 = Array.prototype.reduce.call(
  names,
  (acc, name) => {
    if (acc === "")
      // initial value
      return name;
    return `${acc}, ${name}`;
  },
  "",
);
// nameList2 === "" when names is empty.

См. также

  • Array.prototype.reduce()
  • Array.prototype.reduceRight()
  • TypedArray.prototype.reduce()
  • TypedArray.prototype.reduceRight()
  • Array
  • TypedArray
  • Array.prototype.filter()
  • TypedArray.prototype.filter()

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Reduce_of_empty_array_with_no_initial_value

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API