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)
Тип ошибки
Что пошло не так?
В 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()ArrayTypedArrayArray.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