Iterator.prototype.reduce()

基准线 2025
新推出

自 ⁨2025 年 3 月⁩ 起,此功能可在最新的设备和浏览器版本上使用。此功能可能在旧设备或浏览器上无法正常工作。

reduce() 方法,与 Array.prototype.reduce 类似,它会对迭代器产生的每个元素执行一个由用户提供的“归约”回调函数,并将前一个元素计算的返回值作为参数传递给下一个元素的调用。跨所有元素运行归约器的最终结果是一个单一值。

语法

js
reduce(callbackFn)
reduce(callbackFn, initialValue)

参数

callbackFn

为迭代器生成的每个元素执行的函数。它的返回值成为下一次调用 callbackFnaccumulator 参数的值。对于最后一次调用,返回值成为 reduce() 的返回值。该函数使用以下参数进行调用:

accumulator

由上一次调用 callbackFn 产生的值。第一次调用时,如果指定了 initialValue,则其值为 initialValue;否则,其值为迭代器的第一个元素。

currentValue

当前元素的值。第一次调用时,如果指定了 initialValue,则其值为迭代器的第一个元素;否则,其值为第二个元素。

currentIndex

currentValue 的索引位置。第一次调用时,如果指定了 initialValue,则其值为 0;否则,其值为 1

initialValue 可选

在第一次调用回调函数时,accumulator 被初始化到的值。如果指定了 initialValue,则 callbackFn 将从第一个元素作为 currentValue 开始执行。如果指定 initialValue,则 accumulator 将被初始化为第一个元素,并且 callbackFn 将从第二个元素作为 currentValue 开始执行。在这种情况下,如果迭代器为空(因此没有第一个值可以返回作为 accumulator),则会抛出错误。

返回值

在整个迭代器上运行“归约”回调函数直到完成而产生的值。

异常

TypeError

如果迭代器不包含任何元素且未提供 initialValue,则抛出此错误。

描述

有关 reduce() 如何工作的详细信息,请参阅 Array.prototype.reduce()。与大多数其他迭代器辅助方法不同,它不适合与无限迭代器一起使用,因为它不是惰性的。

示例

使用 reduce()

以下示例创建一个生成斐波那契数列项的迭代器,然后对前十项求和。

js
function* fibonacci() {
  let current = 1;
  let next = 1;
  while (true) {
    yield current;
    [current, next] = [next, current + next];
  }
}

console.log(
  fibonacci()
    .take(10)
    .reduce((a, b) => a + b),
); // 143

规范

规范
ECMAScript® 2026 语言规范
# sec-iterator.prototype.reduce

浏览器兼容性

另见