数组的reduce方法

1,110 阅读1分钟

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