对对象数组进行分组并进行计算以创建新的公共值

时间:2017-08-04 13:56:49

标签: javascript arrays angular aggregate lodash

我正在使用lodash将我的对象分组到我的数组中。

var grouped = _.groupBy(this.tableData, function(obj) {
  return obj.key
});

它给了我一个带键值对的对象。

{mykey1: [{obj1}, {obj2}], mykey2: [obj1]}

我的问题是我如何遍历每个键内的对象并进行计算。例如,如果我的对象中有一个属性cost,我想总结一下我的密钥中每个对象内的所有成本吗?

2 个答案:

答案 0 :(得分:0)

您可以结合使用_.mapValues_.sumBy

var summed = _.mapValues(grouped, function(v){
    return _.sumBy(v, 'cost');
});

下面的实例:



var tableData = [
{key:"obj1",cost:1},
{key:"obj1",cost:1},
{key:"obj1",cost:1},
{key:"obj2",cost:1},
{key:"obj2",cost:1}
]

var grouped = _.groupBy(tableData, function(obj) {
    return obj.key
});

var summed = _.mapValues(grouped, function(v){
    return _.sumBy(v, 'cost');
});
console.log(summed);

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您可以使用原生javascript:

//let obj = {key1: [{cost: 1}, {cost: 2}], key2: [{cost: 3}]}; example input
Object.values(obj).reduce((sum, arr)=> sum + arr.reduce((subsum, element)=>subsum + element.cost, 0), 0);

说明:

Object.values(obj) //-> [[{cost: 1}, {cost: 2}], [{cost: 3}]]
[1, 2, 3].reduce((sum, element)=> sum + element), 0) //-> reduce (converting a list of things into one)