这个数组怎么改,去重去之后算合计

[
    {"name":'a',value:1},
    {"name":'a',value:2},
    {"name":'a',value:3},
    {"name":'b',value:2},
    {"name":'b',value:2},
    {"name":'c',value:1},
]

怎么修改成

[
    {"name":'a',value:6},
 
    {"name":'b',value:4},
 
    {"name":'c',value:1},
]
阅读 2.5k
3 个回答

image.png

var arr = [{"name":'a',value:1},
{"name":'a',value:2},
{"name":'a',value:3},
{"name":'b',value:2},
{"name":'b',value:2},
{"name":'c',value:1}];
var obj = arr.reduce((acc,cur)=>((acc[cur.name]= (acc[cur.name]||0) + cur.value),acc),{});
var res = Object.entries(obj).map(([name,value])=>({name,value}));
console.log(res);

image.png

var arr = [{"name":'a',value:1},
{"name":'a',value:2},
{"name":'a',value:3},
{"name":'b',value:2},
{"name":'b',value:2},
{"name":'c',value:1}];
var obj = arr.reduce(function(acc,cur){
    var item = acc[cur.name];
    if(item){
       item.value = item.value + cur.value;
     } else {
       acc[cur.name] = cur;
     }
    return acc;
},{});
var res = Object.values(obj);
console.log(res);

这个操作应该不叫去重再合计,应该叫做分类合计,或者分组合计。如果用 Lodash 来写,过程是先分组(变成对象),再合计值,再转换回数组:

const r = _(data)
    .groupBy("name")
    .mapValues(value => _.sumBy(value, "value"))
    .entries()
    .map(([key, value]) => ({ name: key, value }))
    .value();

也可以不用 Lodash,自己写个 reduce,逻辑很简单就是普通的循环和循环内查找:

const r = data.reduce((r, it) => {
    let found = r.find(rIt => rIt.name === it.name);
    if (found) {
        found.value += it.value;
    } else {
        found = { ...it };
        r.push(found);
    }
    return r;
}, []);
function unique(arr) {
    var ret = [];
    loop: for (var i = 0; i < arr.length; ++i) {
        for (var j = 0; j < ret.length; ++j) {
            if (ret[j].name === arr[i].name) {
                ret[j].value += arr[i].value;
                continue loop;
            }
        }
        ret.push(arr[i]);
    }
    return ret;
}
console.dir(unique([
    { name: 'a', value: 1 },
    { name: 'a', value: 2 },
    { name: 'a', value: 3 },
    { name: 'b', value: 2 },
    { name: 'b', value: 2 },
    { name: 'c', value: 1 }
]));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
1 篇内容引用
推荐问题
宣传栏