2

js--数组的reduce()方法的使用介绍

 3 years ago
source link: http://www.cnblogs.com/zaishiyu/p/14197699.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
  • 前言

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK