js--数组的reduce()累加方法的使用

更新日期: 2020-12-01 阅读: 2.3k 标签: 数组

前言

阅读文章之前先来考虑一个问题,如何去实现迭代一个数组,并且把它累加到一个值中?首先能够想到的是设置一个初始值,然后通过循环遍历这个数组,将数组中的值一项一项累加起来,然后返回这个设置的值就是最终的结果。这样实现起来也不算太复测,不需要写太多的代码,这篇就介绍一个数组的进阶一点的用法——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]
以上就是本文的全部内容,希望给读者带来些许的帮助和进步,方便的话点个关注,小白的成长之路会持续更新一些工作中常见的问题和技术点。

来自:https://www.cnblogs.com/zaishiyu/p/14197699.html

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/10041

相关推荐

indexOf的三种使用方法

indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。这里基本用法大家一般都清楚,一般在实际工作中常与数组的方法合用来对数组进行一些操作

关于Vue不能监听(watch)数组变化

vue无法监听数组变化的情况,但是数组在下面两种情况下无法监听:利用索引直接设置数组项时,例如arr[indexofitem]=newValue;修改数组的长度时,例如arr.length=newLength

JS计算两个数组的交集、差集、并集、补集(多种实现方式)

使用 ES5 语法来实现虽然会麻烦些,但兼容性最好,不用考虑浏览器 JavaScript 版本,使用 ES5 语法来实现虽然会麻烦些,但兼容性最好,不用考虑浏览器 JavaScript 版本。也不用引入其他第三方库。

js数组中改变元素的位置:互换,置顶,上移,下移

unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。splice() 方法可删除从 index 处开始的零个或多个元素

js使用数组+循环+条件实现数字转换为汉字的简单方法。

单个数字转汉字的解决方法:利用数组存储0-9的汉字、 ary.length和str.length不用多说,这是指ary数组和str字符串的长度。这里我们需要注意的是str.charAt(j)和ary[i],分别指在str这个字符串中索引为j的元素,在ary中索引为i的元素。

Js遍历数组时注意 Empty Item 的影响

这两天碰到个问题:从日志中发现一些来自 iOS 10.3 的报错「Cannot read property \\\'xxx\\\' of undefined」,定位到代码的报错位置,发现是遍历某数组时产生的报错,该数组的元素应该全都是 Object,但实际上出现了异常的元素

JS数组扁平化(flat)方法总结

需求:多维数组=>一维数组 ;flat和flatMap方法为ES2019(ES10)方法,目前还未在所有浏览器完全兼容。第四种处理:用 reduce 实现数组的 flat 方法

数组、字符串去重

今天说的数组和字符串去重呢,主要用到es6新的数据结构 Set,它类似于数组,但是成员的值都是唯一的,没有重复的值,所以活用Set来进行数组和字符串的去重。

Js数组中所有方法(超详细)

concat()把元素衔接到数组中。 every() 方法使用指定函数检测数组中的所有元素:filter()返回满足断言函数的数组元素。forEach()为数组的每一个元素调用指定函数。

[译]async-await 数组循环的几个坑

在 Javascript 循环中使用 async/ await 循环遍历数组似乎很简单,但是在将两者结合使用时需要注意一些非直观的行为。让我们看看三个不同的例子,看看你应该注意什么,以及哪个循环最适合特定用例。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!