【问题标题】:Grouping array of objects and doing a calculation to create a new common value对对象数组进行分组并进行计算以创建新的公共值
【发布时间】:2018-01-12 12:08:41
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 看起来你想要_.mapValues(grouped, group => ....)。参见例如stackoverflow.com/questions/45410237/…
  • var grouped:any = _(this.tableData).groupBy(this.tableData, function(obj) { return obj.key }).mapValues(xs => { });
  • 试过了,出错了,提供的参数与.....错误不匹配

标签: javascript arrays angular aggregate lodash


【解决方案1】:

您可以使用_.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>

【讨论】:

  • 可以使用_.sumBy(v, 'cost')
  • @YuryTarabanko 谢谢 - 我更熟悉 vanilla javascript,而不是 lodash/underscore 方法。
【解决方案2】:

你可以做原生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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多