定义: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
/**
* @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,然后逐步累加。
用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]