js数组的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 可选参数,传递给函数的初始值
*/
/**
* @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 duce((a,b)=>a+b)
console.log(total)//输出10
计算数组中元素出现的次数
let arr =['A','B','C','B','A'];
let times = duce((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 = duce((pre,cur)=>{
at(cur)
},[])
console.log(newArr);// [0, 1, 2, 3, 4, 5]
//同样可以实现多维到⼀维
求对象中属性的总和,如:求班级同学总分
let info=[
{
name:"⼩明",
score:100
},{
naem:"⼩红",
score:110
},
{
name:"⼩强",
score:120
}
]
let duce((pre,cur)=>{typeof array
return pre+cur.score
},0)
console.log(totalScore);//输出330
数组去重
 let arr =[1,2,3,4,4,1]
    let newArr = duce((pre,cur)=>{
    if(!pre.includes(cur)){
    at(cur)
    }else{
    return pre
    }
    },[])
    console.log(newArr);// [1, 2, 3, 4]

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。