zoukankan      html  css  js  c++  java
  • js--数组的reduce()累加方法的使用

    • 前言

    阅读文章之前先来考虑一个问题,如何去实现迭代一个数组,并且把它累加到一个值中?首先能够想到的是设置一个初始值,然后通过循环遍历这个数组,将数组中的值一项一项累加起来,然后返回这个设置的值就是最终的结果。这样实现起来也不算太复杂,不需要写太多的代码,这篇就介绍一个数组的进阶一点的用法——reduce()的用法。

    • 正文

    1. reduce()的基本概念

    定义:reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。 reduce() 对于空数组是不会执行回调函数的。

    分析:reduce()针对非空数组执行操作,接收一个回调函数,这个函数作为一个累加器,定义累加的规则,然后循环遍历进行累加,返回最终结果,需要注意该方法没有创建新数组,同时也不会改变原数组,返回的结果是一个数值(该数值根据返回结果而定)。

    根据上面的理解,先用自己的方法模仿下实现一个数组的累加。

    复制代码
            var arr=[1,2,3,4]
            var rules=function(a,b){
                return a+b
            }
            function myreduce(array,callback){
                //校验
                if (!Array.isArray(array)) {
                    throw('调用对象必须是一个数组');
                }
                if (typeof callback != 'function') {
                    throw('累计器必须是一个函数类型');
                }
                let initialValue=0//定义初始值为0
                if (array.length === 0) {
                    return initialValue;
                }
                for (let index = 0; index < array.length; index++) {
                    initialValue=callback(initialValue,array[index])
                }
                return initialValue
            }
            var totalValue =myreduce(arr,rules)
            console.log(totalValue)//输出10    
    复制代码

        2.reduce()的使用语法

    复制代码
         /**
            * @param function 必要参数,用于执行每个数组元素的函数
            * @param initialValue 可选参数,传递给函数的初始值
            */
            array.reduce(
            /**
            * @param total 必要参数,初始值或计算结束后的结果。
            * @param currentValue 必要参数,当前元素
            * @param currentIndex 可选参数,当前参数的下标
            * @param arr 可选参数,数组对象
            */
            function(total, currentValue, currentIndex, arr),
            initialValue
            );
    复制代码

        分析:reduce()被一个非空数组调用(如果被非空数组调用返回undefined),接收两个参数,一个callback和一个设置的累加初始值,需要注意的是如果给reduce()传入了初始值,则在该值的基础是做累加操作,如果初始值不存在,则total为数组的第一项,currentValue为下一项,在第一项的基础上累加,相当于设置初始值为0,然后逐步累加。

    3.常见使用方法

    用reduce方法实现求数组的和

            var arr=[1,2,3,4]
            var total=arr.reduce((a,b)=>a+b)
            console.log(total)//输出10    

    计算数组中元素出现的次数

    复制代码
            let arr = ['A', 'B', 'C', 'B', 'A'];
            let times = arr.reduce((pre,cur)=>{
            if(cur in pre){
                pre[cur]++
            }else{
                pre[cur] = 1 
            }
            return pre
            },{})
            console.log(times);//输出{A:2,B:2,C:1}    
    复制代码

    将二维数组转成一维

    复制代码
        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]
    //同样可以实现多维到一维
    复制代码

        求对象中属性的总和,如:求班级同学总分

    复制代码
             let info=[
                { 
                    name:"小明",
                    score:100
                },{ 
                    naem:"小红",
                    score:110
                },
                {
                    name:"小强",
                    score:120
                }
            ]
            let totalScore=info.reduce((pre,cur)=>{
                return pre+cur.score
            },0)
            console.log(totalScore);//输出330
    复制代码

        数组去重

    复制代码
        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]
    复制代码

        参数求平均值

        var myAverage=(...args)=>args.reduce((pre,cur)=>pre+cur)/args.length
        console.log(myAverage(0,1,2,3,4))//2

        以上就是本文的全部内容,希望给读者带来些许的帮助和进步,方便的话点个关注,小白的成长之路会持续更新一些工作中常见的问题和技术点。

  • 相关阅读:
    js生成当前时间
    《JavaScript权威指南》读书笔记2
    firefox与ie的兼容(css,html)
    兼容ie ff 等浏览器的jquery,js层移动方法一
    解决文字撑大容器的方法,ie,ff, div,table
    兼容ie ff 等浏览器的jquery,js层移动方法二
    【CSS经典问题】子元素浮动之后如何撑开父元素
    【CSS技巧】列表横向排列的另一种方法
    【CSS经典问题】图片下面有空隙的解决办法
    MYSQL主从复制、主主复制、双主多从配置
  • 原文地址:https://www.cnblogs.com/1549983239yifeng/p/14793237.html
Copyright © 2011-2022 走看看