ES6中的reduce函数详解

reduce函数的语法格式

arr.reduce(callback,[initialValue])
/* callback (执行数组中每个值的函数,包含四个参数)

        1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
        2、currentValue (数组中当前被处理的元素)
        3、index (当前元素在数组中的索引)
        4、array (调用 reduce 的数组)

        initialValue (作为第一次调用 callback 的第一个参数(初始previousValue)。)*/

下面上代码就更好理解了

//数组求和
var arr = [1, 2, 3, 4];

 var sum = arr.reduce(function(prev, cur, index, arr) {
    
    
 //调试,实在不明白可以单步调试一下
// debugger
     console.log(prev, cur, index,arr);
     return prev + cur;
     //下面的指定pre的初始值为0
 },0)
 console.log(arr, sum);

这个函数本质就是遍历数组,cur和index会从数组的开始移动到最后,函数的返回值作为下一次调用函数的pre值(如果遍历完就是reduce的返回值)
第一次调用函数:pre = 0,cur = 1,index = 0,arr=[1,2,3,4] 返回(下一次的pre)1;
第二次调用函数:pre = 1,cur = 2,index = 1,arr=[1,2,3,4] 返回(下一次的pre)3;
第三次调用函数:pre = 3,cur = 3,index = 2,arr=[1,2,3,4] 返回(下一次的pre)6;
第四次调用函数:pre = 6,cur = 4,index = 3,arr=[1,2,3,4]返回reduce函数的返回值10;

在看下面demon(reduce高级用法)加深理解


//reduce函数的高级用法,求数组中元素的出现次数

let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
let nameNum = names.reduce((pre,cur,index)=>{
    
    
    console.log(pre,cur,index)
    if(cur in pre){
    
    
        pre[cur]++
    }else{
    
    
        pre[cur] = 1
    }
    console.log(pre,cur,index)
    return pre
},
    //这里设置pre初始值是空对象
    {
    
    })
console.log(nameNum); //{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}
//数组的去重
    let arr = [1,2,3,4,5,1,3,7,2,1,3,4,8,5,5,7]
    newarr = arr.reduce((pre,curr,index,arr)=>{
    
    
       // debugger
        console.log(pre,curr)
        //console.log(typeof pre,typeof curr)
        //不可以写成curr in pre  原因往下看
        if (pre.includes(curr)) console.log(curr+"已经包含在对象中了");
        else pre.push(curr)
        return pre
    },[])
    console.log(arr)
    console.log(newarr)*/

上面的两个例子,第一个判断一个属性是否在对象中可以用in关键字来做。
但是坑来了,为什么下面判断元素是否在数组中不可以用in?这就涉及到in和includes的区别了,请看下面的博客

ES6 in和includes区别
文章如有错误欢迎大佬批评指正。

猜你喜欢

转载自blog.csdn.net/qq_44606064/article/details/109545242