Iterator.prototype.reduce()

实验性: 这是一项实验性技术
在将其用于生产之前,请仔细检查浏览器兼容性表格

Iterator 实例的 reduce() 方法类似于 Array.prototype.reduce:它对迭代器生成的每个元素执行用户提供的“reducer”回调函数,并传入前一个元素的计算结果作为参数。对所有元素运行 reducer 回调函数的最终结果为单个值。

语法

js
reduce(callbackFn)
reduce(callbackFn, initialValue)

参数

callbackFn

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

accumulator

上一次调用 callbackFn 的结果。在第一次调用时,如果指定了 initialValue 则为指定的值,否则为迭代器第一个元素的值。

currentValue

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

currentIndex

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

initialValue 可选

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

返回值

在整个迭代器上运行“reducer”回调函数直至其完成所返回的结果。

异常

TypeError

如果迭代器没有包含任何元素并且没有提供 initialValue,则抛出该异常。

描述

参见 Array.prototype.reduce() 以了解 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

规范

Specification
Iterator Helpers
# sec-iteratorprototype.reduce

浏览器兼容性

BCD tables only load in the browser

参见