1、语法
arr.reduce(callback,[initialValue])
reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(或者上一次回调函数的返回值),当前元素值,当前索引,调用 reduce 的数组。
callback (执行数组中每个值的函数,包含四个参数)
1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
2、currentValue (数组中当前被处理的元素)
3、index (当前元素在数组中的索引)
4、array (调用 reduce 的数组)
initialValue
(作为第一次调用 callback 的第一个参数。)
2、用法
(1)简单用法
let arr1 = [1,2,3,4,5]
//求和
let sum=arr1.reduce((pre,item)=>{
return pre + item
},0)
console.log('sum=',sum); //15
//求积
let mul = arr1.reduce((x,y)=>{
return x*y
})
console.log('mul=',mul) //120
(2)数组中元素出现的次数
let name=[1,5,2,1,6,5,1,2,4,2,4,3,5,6];
let nameNum = name.reduce((pre,item)=>{
if(item in pre){
pre[item] ++
}else{
pre[item]=1
}
return pre
},{})
console.log('次数',nameNum) //{1: 3, 2: 3, 3: 1, 4: 2, 5: 3, 6: 2}
(3)数组去重
let name=[1,5,2,1,6,5,1,2,4,2,4,3,5,6];
let newArr=name.reduce((pre,item)=>{
if(!pre.includes(item)){
return pre.concat(item)
}else{
return pre
}
},[])
console.log('newArr',newArr) //[1,5,2,6,4,3]
quchong(){
/**
* indexof()检索该值在数组中是否存在,不存在返回-1
*/
let arr=[];
this.arr1.forEach((item)=>{
if(arr.indexOf(item)=== -1){
arr.push(item)
}
})
return arr;
}
(4)将二维数组转化为一维数组
let cat=[[1,2],[2,3],[3,4],[4,5]];
let newCat=cat.reduce((pre,item)=>{
return pre.concat(item)
},[])
console.log(‘二维’,newCat) //[1,2,2,3,3,4,4,5]
(5)多维数组转化为一维
let drunk=[[0,1],[1,2],[1,[1,2,3,4],5]];
let newDrunk=function(drunk){
return drunk.reduce((pre,item)=>pre.concat(Array.isArray(item)?newDrunk(item):item),[])
}
console.log(‘多维’,newDrunk(drunk)) //[0,1,1,2,1,1,2,3,4,5]
(6)对象中的属性求和
let result=[{
subject:‘math’,
score:10
},{
subject:‘math’,
score:10
},{
subject:‘math’,
score:10
}]
let total = result.reduce(function(pre,item){
return pre+item.score
},0)
console.log(‘分数和:’,total) //30
(7)将对象中的某个字段的值拼接为字符串
data()中定义的数据
arr:[{
name:‘测试一’,
value:1
},{
name:‘测试二’,
value:2
},{
name:‘测试三’,
value:3
},{
name:‘测试四’,
value:4
}]
computed
objectOfStr(){
let arr1=[];
let str = this.arr.reduce((pre,item)=>{
return arr1.push(item.value)
},[]);
arr1 = arr1.join()
return arr1;
}