JS 数组对象,合并其中某一属性值相同的项且属性值相加

这里要处理的数组结构如下:

const list = [
  { pro: 'pro1', v: 666},
  { pro: 'pro2', v: 66},
  { pro: 'pro3', v: 636},
  { pro: 'pro1', v: 166},
  { pro: 'pro2', v: 266},
  { pro: 'pro1', v: 606},
]

我们需要将pro相同的 v值加起来,输出 [name: k, value: v]这样形式的数组。
这里针对需求,分析,首先需要把对应的k取出来,这里我们就先用到map来存取。

话不多说,上代码
const handelData = (r) => {
  const v = [...r]
  const aMap = new Map()
  const arr = []
  
  v.forEach((e) => {
    const k = e.pro
    aMap.set(k, (aMap.get(k) || 0) + Number(e.v))
  })
  
  aMap.forEach((e, k) => {
    arr.push({ name: k, value: e })
  })
  
  return arr
}

console.log('res ====== ', handelData(list))
这里我们可以再把这个方法封装一下,让它变得通用一些
const handelData = (r, orgK, orgV, changeK, changeV) => {
  const v = [...r]
  const aMap = new Map()
  const arr = []
  
  v.forEach((e) => {
    const k = e[orgK]
    aMap.set(k, (aMap.get(k) || 0) + Number(e[orgV]))
  })
  
  aMap.forEach((val, key) => {
    const item = {}
    item[changeK] = key
    item[changeV] = val
    arr.push(item)
  })
  
  return arr
}

console.log('res ====== ', handelData(list, 'pro', 'v', 'name', 'value'))

这样的话,就可以对不同的数组复用了,还是很简单吧

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值