Iterator.prototype.reduce()

实验性: 这是一个 实验性技术
在生产环境中使用此功能前,请仔细查看 浏览器兼容性表格

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

语法

js
reduce(callbackFn)
reduce(callbackFn, initialValue)

参数

callbackFn

对迭代器生成的每个元素执行的函数。其返回值成为 callbackFn 下一次调用时 accumulator 参数的值。对于最后一次调用,返回值成为 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

规范

规范
迭代器辅助函数
# sec-iteratorprototype.reduce

浏览器兼容性

BCD 表格仅在启用了 JavaScript 的浏览器中加载。

另请参阅