【发布时间】:2019-07-01 03:36:46
【问题描述】:
MDN 定义 reduce() 如下:
reduce() 方法对数组的每个元素执行(您提供的)reducer 函数,从而产生单个输出值。
我们不要想当然,只分析以下语句的语法:
const array1 = [1, 2, 3, 4];
const reducer = (y, x) => y + x;
// 1 + 2 + 3 + 4
console.log(array1.reduce(reducer));
// expected output: 10
// 5 + 1 + 2 + 3 + 4
console.log(array1.reduce(reducer, 5));
- reducer 是一个函数,它接受两个参数并返回它们的总和
- reducer 在数组的每个元素上执行,但“数组的每个元素”只是一个参数,为什么我可以假设 SUM 是另一个参数并缓存在某个地方等待下一次添加操作?为什么我可以假设 reduce 在最后返回总和?
有人可以回答这些问题吗?来自其他语言背景的人,例如C里面也有函数的概念。我经常对 Javascript 的语法感到困惑。
这就是我看到时更加困惑的原因:
const pipeline = [
array => { array.pop(); return array; },
array => array.reverse()
];
pipeline.reduce((xs, f) => f(xs), [1, 2, 3]);
再次因为,根据 MDN,reduce() 方法对数组的每个元素执行(您提供的)reducer 函数,从而产生单个输出值。
只有这一次,
reducer: (xs, f) => f(xs)
累加器:[1, 2, 3]
array1:管道
那么我们如何解释它的行为类似于我们用英语的第一个例子?
【问题讨论】:
-
您过早停止阅读。 “你的 reducer 函数的返回值被分配给累加器,它的值在整个数组的每次迭代中都会被记住,并最终成为最终的单一结果值。”
-
1。 reducer 接受四个参数,前两个是强制性的(请参阅缺少方括号)。你可以传递更多,就像在任何 JS 函数中一样,但它们将被忽略。 2。
Array.prototype.reduce不是求和,你可以做其他一些事情,比如计数、计算平均值、展平等。Reduce 是关于在迭代数组中的每个元素时使用累加器。 -
@RaymondChen 谢谢,雷蒙德。我的坏习惯。过早停止阅读:(
-
为什么杰克的回答被删了?!我试图提出后续问题
-
@RaymondChen 在第二个例子中,pipeline 是要归约的数组,(xs, f) => f(xs) 是归约函数,[1, 2, 3] 是累加器初始化价值,我们如何用英语证明和解释?
标签: javascript arrays ecmascript-6