如何使用 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 并基于我想要的组添加 original 和 gauge 值最终输出如图所示
这是我的代码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
所以基本上你想要的是:
- 按
zone
属性分组
- 然后在每个组中,嵌套组按
group
属性
- 然后对于每个组,您希望
zone
作为键 zone
值和
groups
键作为所有嵌套组的数组值。
- 并且在每个嵌套组中您想要
zone
、grroup
值
直接和所有其他 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>
我是开发新手。
我想在 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 并基于我想要的组添加 original 和 gauge 值最终输出如图所示
这是我的代码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
所以基本上你想要的是:
- 按
zone
属性分组 - 然后在每个组中,嵌套组按
group
属性 - 然后对于每个组,您希望
zone
作为键zone
值和groups
键作为所有嵌套组的数组值。 - 并且在每个嵌套组中您想要
zone
、grroup
值 直接和所有其他 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>