简体   繁体   English

按数组中的多个键对对象值数组求和

[英]Sum array of objects values by multiple keys in array

Suppose I have:假设我有:

const arr = [
    {'name': 'P1','value': 150, 'nn': 2},
    {'name': 'P1','value': 150, 'nn': 3},
    {'name': 'P2','value': 200, 'nn': 5},
    {'name': 'P3','value': 450, 'nn': 1}
]
const keysToSum = ['value', 'nn' ]

and I want:而且我要:

[
  { name: 'P1', value: 300, nn: 5 },
  { name: 'P2', value: 200, nn: 5 },
  { name: 'P3', value: 450, nn: 1 }
]

So I want to sum the values inside the keys value and nn (because these keys are in keysToSum ) if name is the same.因此,如果name相同,我想对键valuenn的值求和(因为这些键在keysToSum )。 How can I do that?我怎样才能做到这一点?

I know I can use reduce , for example:我知道我可以使用reduce ,例如:

const result = arr.reduce((acc, val) => {
    const o = acc.filter((obj) => {
        return obj.name == val.name;
    }).pop() || {name: val.name, value: 0};
    
    o.value += val.value;
    acc.push(o);
    return acc;
},[])

But this piece of code works with only a key (value in that case), how can generalize it using keysToSum ?但是这段代码只适用于一个key (在那种情况下是值),如何使用keysToSum概括它?

 const arr = [ {'name': 'P1','value': 150, 'nn': 2}, {'name': 'P1','value': 150, 'nn': 3}, {'name': 'P2','value': 200, 'nn': 5}, {'name': 'P3','value': 450, 'nn': 1} ]; const result = arr.reduce((acc, val) => { const o = acc.filter((obj) => { return obj.name == val.name; }).pop() || {name: val.name, value: 0}; o.value += val.value; acc.push(o); return acc; },[]); console.log(result)

You could reduce the array by using an object and iterate the wanted keys for summing property values.您可以通过使用对象来减少数组并迭代所需的键以求和属性值。

 const array = [{ name: 'P1', value: 150, nn: 0 }, { name: 'P1', value: 150, nn: 3 }, { name: 'P2', value: 200, nn: 2 }, { name: 'P3', value: 450, nn: 5 }], keysToSum = ['value', 'nn'], result = Object.values(array.reduce((r, { name, ...o }) => { if (!r[name]) r[name] = { name }; keysToSum.forEach(k => r[name][k] = (r[name][k] || 0) + o[k]); return r; }, [])); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

Using reduce with an object that uses the name as a key, you can easily keep track of the objecs with dupe and increment the properties.将reduce 与使用名称作为键的对象一起使用,您可以轻松地跟踪带有dupe 的对象并增加属性。

 const arr = [ {'name': 'P1','value': 150, 'nn': 0}, {'name': 'P1','value': 150, 'nn': 3}, {'name': 'P2','value': 200, 'nn': 2}, {'name': 'P3','value': 450, 'nn': 5} ] const keysToSum = ['value', 'nn' ] const summed = Object.values(arr.reduce((obj, record) => { // have we seen this name yet? If not copy the record if (!obj[record.name]) { obj[record.name] = { ...record }; } else { // if we saw it, sum the fields we care about keysToSum.forEach(key => { obj[record.name][key] += record[key]; }) } return obj }, {})); console.log(summed)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM