如何使用 lodash 添加相同对象的总和

How to add sum of same objects using lodash

我是开发新手。

我想在 json 个对象的数组中对相同的对象进行分组。例如。这是我的 JSON 数组:

var data = [
    {
        zone: "Bottom",
        group: "Bottom girders",
        original: 7,
        gauge: 3,
        dPercent: 0,
        permissible: 10,
    },
    {
        zone: "Bottom",
        group: "Bottom girders",
        original: 9,
        gauge: 7,
        dPercent: 0,
        permissible: 10,
    },
    {
        zone: "Bottom",
        group: "risers",
        original: 7,
        gauge: 3,
        dPercent: 0,
        permissible: 10,
    },
    {
        zone: "Neutral axis",
        group: "Transverse PSM",
        original: 17,
        gauge: 28,
        dPercent: 0,
        permissible: 15,
    },
    {
        zone: "Neutral axis",
        group: "Transverse PSM",
        original: 17,
        gauge: 12,
        dPercent: 0,
        permissible: 15,
    },
];

我期望的最终输出是:

[
      {
        "zone": "Neutral Axis",
        "groups": [
           { "zone":"Bottom", "group":"Bottom girders","original": 34, "gauge": 40, "dPercent": 5.3, "permissible": 10 }
        ]
      },
      {
        "zone": "Bottom",
        "groups": [
           { "zone":"Bottom", "group":"Bottom girders", "original": 16, "gauge": 10, "dPercent": 5.3, "permissible": 10 },
           { "zone":"Bottom", "group":"risers", "original": 7, "gauge": 3, "dPercent": 5.3, "permissible": 10 }
        ]
      }
    ]

逻辑: 我想先将数据 zone 明智地分组,然后每个 zone 具有不同的 group 并基于我想要的组添加 originalgauge 值最终输出如图所示

这是我的代码link我试过了 https://angular-ivy-zm5kqo.stackblitz.io

非常感谢您!

根据您的输出示例,我假设您希望按 zone 属性 对实体进行分组,并将结果作为数组。

执行此操作的代码:

var data = [/*your data here*/];

var groupedData = _.groupBy(data, 'zone');
var result = _.map(groupedData, (value, key) => {
  return {
    "zone": key,
    "groups": value
  }
});

它可以被链接起来,如果你喜欢那样的话:

var result = _.chain(data)
  .groupBy('zone')
  .map((value, key) => {
    return {
      "zone": key,
      "groups": value
    }
  }).value();

_.groupBy 将您的数据数组转换为如下对象:

{
   "Bottom":[
      /* All entities where zone is "Bottom" */
   ],
   "Neutral axis":[
      /* All entities where zone is "Neutral axis" */
   ]
}

然后我们使用 _.map.

将此对象转换为您想要的对象的数组

资源:

https://lodash.com/docs/4.17.15#groupBy

https://lodash.com/docs/4.17.15#map

https://lodash.com/docs/4.17.15#chain

所以基本上你想要的是:

  1. zone属性分组
  2. 然后在每个组中,嵌套组按 group 属性
  3. 然后对于每个组,您希望 zone 作为键 zone 值和 groups 键作为所有嵌套组的数组值。
  4. 并且在每个嵌套组中您想要 zonegrroup 值 直接和所有其他 4 个属性的总和 4 该嵌套组 对于每个键 (original, original, original, original)

让我们在一个片段中轻松地做同样的事情:

const data = [{"zone":"Bottom","group":"Bottom girders","original":7,"gauge":3,"dPercent":0,"permissible":10},{"zone":"Bottom","group":"Bottom girders","original":9,"gauge":7,"dPercent":0,"permissible":10},{"zone":"Bottom","group":"risers","original":7,"gauge":3,"dPercent":0,"permissible":10},{"zone":"Neutral axis","group":"Transverse PSM","original":17,"gauge":28,"dPercent":0,"permissible":15},{"zone":"Neutral axis","group":"Transverse PSM","original":17,"gauge":12,"dPercent":0,"permissible":15}];

var res = _(data)
    .groupBy('zone')
    .map((grp, zone) => ({
        zone,
        groups: _(grp).groupBy('group').map((nestGrp, group) => ({
            zone,
            group,
            original: _.sumBy(nestGrp, 'original'),
            gauge: _.sumBy(nestGrp, 'gauge'),
            dPercent: _.sumBy(nestGrp, 'dPercent'),
            permissible: _.sumBy(nestGrp, 'permissible')
        })).value()
    })).value();
    
 console.log(res);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>