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));
有人可以回答这些问题吗?来自其他语言背景的人C里面也有功能概念。我经常对Javascript的语法感到困惑。
这就是我看到时变得更加困惑的方式:
const pipeline = [
array => { array.pop(); return array; },
array => array.reverse()
];
pipeline.reduce((xs, f) => f(xs), [1, 2, 3]);
再次,因为MDN认为,reduce()方法在数组的每个元素上执行reducer函数(由您提供),从而产生单个输出值。
仅这次
减速器:(xs,f)=> f(xs)
累加器:[1、2、3]
array1:管道
那么我们如何用英语解释类似于我们第一个例子的行为?
答案 0 :(得分:0)
reducer在数组的每个元素上执行,但是“数组的每个元素”仅是一个参数,为什么我可以假设SUM是另一个参数并缓存在某个位置,等待下一个添加操作?
提供的回调被多次调用,对数组中的每个项目调用一次(或者,如果没有提供初始值,则length - 1
次)。您可以轻松地自己实现:
const array1 = [1, 2, 3, 4];
const reducer = (y, x) => y + x;
Array.prototype.myReduce = function(callback, initialValue) {
let accum = initialValue === undefined
? this.shift()
: initialValue;
for (let i = 0; i < this.length; i++) {
accum = callback(accum, this[i], i, this);
}
return accum;
}
// 1 + 2 + 3 + 4
console.log(array1.myReduce(reducer));
// expected output: 10
// 5 + 1 + 2 + 3 + 4
console.log(array1.myReduce(reducer, 5));
仅仅因为将一个函数传递给.reduce
(或任何其他函数)并没有限制该函数可以被调用的次数。
为什么我可以假设reduce会在最后返回总和?
这就是方法的定义方式-像上面的实现一样,累加器(或accum
)在每次迭代时都被重新分配,并传递给下一次对回调的调用。
该方法实际上不是用浏览器的浏览器本机实现来编写的,但其功能(大部分)是相同的。
pipeline
的工作方式相同。对于提供的数组的每个元素,将重新分配累加器,然后使用新的累加器调用下一个元素。这里,有一个正在调用的函数数组,每个函数的返回值都用作下一个累加器,最后一个函数调用返回的值就是整个.reduce
调用所解析的。
const pipeline = [
array => { array.pop(); return array; },
array => array.reverse()
];
pipeline.reduce((xs, f) => f(xs), [1, 2, 3]);
项目1:初始值(累加器)为[1、2、3]。插入array => { array.pop(); return array; }
,然后.pop()
,将其最后一个值(3生成[1, 2]
,然后返回数组。
项目2:累加器(上次迭代的返回值)为[1, 2]
。将其插入array => array.reverse()
,您将得到相同的数组,相反:[2, 1]
。
数组中没有更多的项目,因此此[2, 1]
是整个reduce
调用求和的值。