js 对象数组中相同的key ,value值相加

var arry= [
    {key:'a',value:2},
    {key:'a',value:2},
    {key:'a',value:2},
    {key:'b',value:8}
]

期望得到结果:

var newArr =[
    {key:'a',value:6},
    {key:'b',value:8}
]
阅读 16k
9 个回答

这基本跟刚才那个是一样的逻辑啊 稍微改下不就行了??

var obj = {};
arr.forEach(function(value){
    var id = value.id,
        num = value.num ;
    if(obj.hasOwnProperty(id)){
       // var cur = obj[id].num;
       // obj[id].num = Math.max(cur, num) ;
       obj[id].num += num
    }else{
        obj[id] = {
            'id' : id,
            'num' : num
        }
    }
})
console.log(Object.values(obj))
var array = [
    {key: 'a', value: 2},
    {key: 'a', value: 2},
    {key: 'a', value: 2},
    {key: 'b', value: 8}
];
var newArr = [{key:array[0].key, value: 0}];
array.forEach((item, index)=>{
    newArr.forEach((item2, index2) => {
        if (item.key == item2.key) {
            newArr[index2].value += item.value;
        } else {
            newArr.push(item);
        }
    })
});
console.log(newArr);
var arry= [
    {key:'a',value:2},
    {key:'a',value:2},
    {key:'a',value:2},
    {key:'b',value:8}
]

let result = {};
array.forEach(item => {
    if(result[item.key]){
        result[item.key] += item.value;
    }else{
        result[item.key] = item.value;
    }
})

let s = [];
for(let k in result){
    s.push({key:k,value:result[k]});
}

Array.prototype.reduce 了解一下。

array.reduce((resp, obj)=> {
    var originObj = resp.find(item => item.key === obj.key);
    if (originObj) {
        originObj.value+= obj.value;
    } else {
        resp.push(obj)
    }
    return resp;
}, [])
function keyPlusValue(arr) {
  const result = arr.reduce((obj, item) => {
    if (!obj[item.key]) {
      obj[item.key] = 0
    }
    obj[item.key] += item.value
    return obj
  }, {})
  return Object.keys(result).map(key => ({key: key, value: result[key]}))
}
console.log(keyPlusValue(arr))

这是我当时解决的方案

var arry =[
     {name:'a',value:2},
     {name:'a',value:2},
     {name:'a',value:2},
     {name:'b',value:8}
     
     ]
        var temp = {};var data=[];
        for(var i in arry) {
            var key= arry[i].name;
            if(temp[key]) {
                temp[key].value = temp[key].value + arry[i].value;
                temp[key].name = arry[i].name;
            } else {
                temp[key] = {};
                temp[key].value = arry[i].value;
                temp[key].name = arry[i].name;
            }
            
        }
        console.log(temp)
var newArr = [...arry.reduce((m, x) => m.set(x.key, (m.get(x.key) || 0) + x.value), new Map())]
  .map(([key, value]) => ({ key, value }))

var arry= [

        {key:'a',value:2},
        {key:'a',value:2},
        {key:'a',value:2},
        {key:'b',value:8}
    ]
    let target = [];
    let keysArr =[...new Set( arry.map(item=>item.key))]  ;

    keysArr.forEach(item=>{
       const  arr = arry.filter(keys=>keys.key == item);
       const sum = arr.reduce((a,b)=>a+b.value,0)
        target.push({
            key:item,
            value:sum
        })
    })
    console.log(  target )

用 lodash 里面的 sumBy()方法

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题