• 函数reduce()的应用


    今天看视频偶然看到讲课老是用到reduce()方法,以前好像基本没有用过,于是查阅一下文档,学习一下

    定义和用法:

    reduce()方法可以接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值

    reduce()可以作为一个高阶函数,用于函数的compose

    注意:reduce()对于控数组是不会执行回调函数的

    语法:

    array.reduce(function(total,currentValue,currentIndex,arr),initialValue)

    实例1:

    var arr = [1, 2, 3, 4];
    var sum = arr.reduce(function(prev, cur, index, arr){
        console.log(prev, cur, index);
        return prev + cur;
    })
    console.log(arr, sum);
    
    
    /*
    打印结果:
    1 2 1
    3 3 2
    6 4 3
    [1, 2, 3, 4], 10
    */

    从上面这个例子可以看出,index是从1开始的,第一次的prev的值就是数组的第一个值,数组长度是4,但是reduce函数循环3次

    实例2:

    var arr = [1, 2, 3, 4];
    var sum = arr.reduce(function(prev, cur, index, arr){
        console.log(prev, cur, index);
        return prev + cur;
    }, 0) //注意这里设置了初始值
    console.log(arr, sum);
    
    
    /*
    打印结果:
    0 1 0
    1 2 1
    3 3 2
    6 4 3
    [1, 2, 3, 4], 10
    */

    这个例子是在实例1的基础上,赋予了初始值,index是从0开始的,第一次的prev的值就是我们设置的初始值0,数组长度是4,reduce函数循环4次

    结论:结合上面两个实例,如果没有提供initialValue, reduce会从索引1的地方开始执行callback方法,跳过第一个索引。如果提供initialValue,从索引0开始

    注意:如果数组为空的话,运用reduce会报错,但是,如果设置了初始值,就不会报错,所以一半来说提供初始值保险一点

    reduce的简单用法,就是我们常用的数组求和,求乘积了

    var arr = [1, 2, 3, 4];
    var sum = arr.reduce((x,y)=>x+y);
    var mul = arr.reduce((x,y)=>x*y);
    console.log(sum);//求和:10
    console.log(mul);//求乘积:24

    reduce的高级用法

    (1)计算数组中每个元素出现的次数

    let names = ['one', 'two', 'three', 'four', 'one'];
    let nameNum = names.reduce((pre,cur)=>{
        if(cur in pre){
            pre[cur]++
        }else{
            pre[cur] = 1
        }
        return pre
    },{})
    console.log(nameNum);//{one:2, two:1, three:1, four:1}

    (2)简单数组去重

    let arr = [1,2,3,4,4,1]
    let newArr = arr.reduce((pre,cur)=>{
        if(!pre.includes(cur)){
            return pre.concat(cur)
        }else{
            return pre
        }
    },[])
    console.log(newArr);//[1,2,3,4]

    (3)数组对象去重

    let arr = [
        {name:'mom', id:1},
        {name:'timo', id:2},
        {name:'mom', id:1},
        {name:'timo', id:2},
    ]
    let obj = {}
    let newArr = arr.reduce((item, next)=>{
        obj[next.id] ? "" : (obj[next.id] = true && item.push(next));
        return item;
    },[])
    console.log(newArr);//[{name:'mom', id:1},{name:'timo', id:2}]

    (4)将二维数组转化为一维

    let arr = [[0,1], [2,3], [4,5]];
    let newArr = arr.reduce((pre,cur)=>{
        return pre.concat(cur);
    },[])
    console.log(newArr);//[0,1,2,3,4,5]

    (5)将多维数组转化为一维

    let arr = [[0,1],[2,3],[4,[5,6,7]]];
    const newArr = function(arr){
        return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])
    }
    console.log(newArr(arr));//[0,1,2,3,4,5,6,7]

    (6)对象里的属性求和

    var result = [
        {
            subject:'math',
            score:10
        },
        {
            subject:'chinese',
            score:20
        },
        {
            subject:'english',
            score:30
        },
    ];
    var sum = result.reduce(function(prev, cur){
        return cur.score + prev;
    }, 0);
    console.log(sum);//60
  • 相关阅读:
    性能测试1 概述
    CURRENMONTH TAG in Automation Framework
    [luoguP1076] 寻宝(模拟)
    [luoguP1220] 关路灯(DP)
    [luoguP1373] 小a和uim之大逃离(DP)
    [HDU2089] 不要62 (数位DP)
    [luoguP1095] 守望者的逃离(DP)
    [luoguP1156] 垃圾陷阱(DP)
    [luoguP1736] 创意吃鱼法(DP)
    [luoguP1417] 烹调方案(背包DP)
  • 原文地址:https://www.cnblogs.com/chao202426/p/16166144.html
Copyright © 2020-2023  润新知