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