记录:reduce语法和应用场景

记录: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 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值