reduce语法介绍
reduce方法接受两个参数,一个是处理数组各元素的回调函数,另一个是初始值;
code
arr.reduce(callback,initValue);
code
callback接受三个参数,分别是,前一轮运行的结果,当前正在遍历的元素和当前遍历元素的index;
code
function(prevValue,curValue,curIndex){}
code
initValue是可选参数,如果不传,则第一次遍历prevValue的值即为数组第一个元素的值,若传,则第一次遍历prevValue的值即为传入的initValue,curValue变成数组第一个元素的值;
reduce每次遍历,会将上次遍历的结果赋值给prevValue,利用这个特性,我们可以用reduce写一个数组求和的方法;
code
function sum(arr) {
return arr.reduce(function(m,n){
return m+n;
})
}
```code```
但这样写有一个问题,如果是空数组的话,则会报错Uncaught TypeError: Reduce of empty array with no initial value。所以我们需要给reduce方法传入第二个参数;
code
function sum(arr) {
return arr.reduce(function(m,n){
console.log(m,n);
return m+n;
},0)
}
这样即便是空数组,也不会报错,而是返回0;
sum([1,2,3]);
log:
0 1
1 2
3 3
result:6
实现组合函数
reduceFn([a, b, c])(1)这种函数我们并不陌生,第一层函数调用完毕返回另一个函数,然后继续执行;但现在我们要实现连续处理多个函数的方法,怎么办呢?reduce的迭代特性是个很好的尝试
code
const reduceFn = (funcs) => {
return function(input){
return funcs.reduce(function(input,fn){
return fn(input);
},input);
}
}
function a (x){
return x+3;
}
function b (x){
return x*2;
}
function c (x){
return x+100;
}
console.log(reduceFn([a, b, c])(1));
result:108
code