记录:reduce语法和应用场景
语法
reduce接收2个参数
第一个参数:回调函数
第二个参数:初始值
第一个参数又接收4个参数,分别是
accumulate 累计器
current value 当前值
current index 当前索引
source array 源数组
常用的参数是 acc 累计值 和 cur 当前值
const arr = [1,2,3]
// 无初始值
arr.reduce((acc,cur)=>{
return acc+cur
})
// 1+2+3
// 6
// 有初始值
arr.reduce((acc,cur)=>{
return acc+cur
},4)
// 4+1+2+3
// 10
常见使用场景
1.二维数据转一维
const arr = [[1,2],[2,3]]
arr.reduce((acc,cur)=>{
return acc.concat(cur)
},[])
// [1,2,2,3]
2.计算数组中每个元素出现的个数
const arr = [1,2,2,3]
arr.reduce((acc, cur) => {
if (!(cur in acc)) {
acc[cur] = 1
} else {
acc[cur] += 1
}
return acc
}, {})
// {1:1,2:2,3:1}
3.按属性给数组分类(合并数组的相同项也是用这个思路改)
const arr = [
{id:1,sum:90},
{id:2,sum:19},
{id:3,sum:29},
{id:2,sum:39},
{id:1,sum:99}
]
arr.reduce((acc,cur)=>{
// 如果不存在cur.id这个键,就赋值空数组[]
if(!arr[cur.id]){
arr[cur.id] = []
}
arr[cur.id].push(cur)
return arr
},{})
{
// 1:{
// {id:1,sum:90},
// {id:1,sum:99}
// },
// 2:{
// {id:2,sum:19},
// {id:2,sum:39}
// },
// 3:{
// {id:3,sum:29}
// }
//}
4.去重
const arr = [1,1,1,2,2,2,3,3,3]
arr.reduce((acc,cur)=>{
if(!acc.includes(cur)){
acc.push(cur)
}
return acc
},[])
// [1,2,3]
4.1 根据数组中的某个属性去重
const arr = [
{ name: '仙剑奇侠传', id:1},
{ name: '还珠格格三', id:2},
{ name: '仙剑奇侠传', id:3},
{ name: '还珠格格三', id:4},
]
let peace = []
arr.reduce((acc,cur)=>{
peace[cur[name]]?'':(peace[cur[name]]=true && acc.push(cer))
},[])
//[
// 0:[{ name: '仙剑奇侠传', id:1}],
// 1:[{ name: '还珠格格三', id:2}],
//]
5.最大最小值
const arr = [
{num:10},
{num:17},
{num:11}
]
arr.reduce((acc,cur)=>{
if(!acc){
acc = cur
return acc
}
if(acc.num < cur.num){
acc = cur
return acc
}
return acc
},0)
// {num:17}
6.平均数
const arr = [1,1,1,2,2,2,3,3,3]
const a = arr.reduce((acc,cur)=>{
return acc + cur
})
a = a/arr.length
结合 async await
function Todo(num){
return new Promise(resolve=>{
setTimeout(()=>{
resolve(num*num)
},1000)
})
}
async function Total(arr=>{
return arr.reduce(async(acc,cur)=>{
const at = await acc
const todo = await Todo(cur)
at[cur] = todo
return at
},Promise.resolve({})
})
(async()=>{
const x = await Total([1,2,3])
console.log(x)
})()
// { '1': 1, '2': 4, '3': 9 }