这可能是补救措施,但我无法弄清楚。我试过使用 d3 并使用 lodash 来获得有效的解决方案,但没有得到任何结果。
我在 JavaScript 中有一个对象数组。如果 [Selected] 值为 true,我想创建一个按 [Version Name] 分组的对象,其中包含 distinct 区域的计数,以及每个版本的总和。例如对象...
[
{ Selcted: false, Version Name: "aaa", Zone: "11111", Value: 5 },
{ Selcted: false, Version Name: "aaa", Zone: "11111", Value: 10 },
{ Selcted: true, Version Name: "aaa", Zone: "11111", Value: 15 },
{ Selcted: true, Version Name: "aaa", Zone: "11111", Value: 20 },
{ Selcted: true, Version Name: "aaa", Zone: "22222", Value: 25 },
{ Selcted: true, Version Name: "bbb", Zone: "22222", Value: 30 },
{ Selcted: true, Version Name: "bbb", Zone: "22222", Value: 35 },
{ Selcted: true, Version Name: "bbb", Zone: "2222", Value: 40 }
]
应该返回结果
[
{ Version Name: "aaa", Zone Count: "2", Value Sum: 50 },
{ Version Name: "bbb", Zone Count: "1", Value Sum: 105 },
]
最佳答案
这使用了我最喜欢的 groupBy 函数 :) 一旦你获得了组,你就可以做另一个组来获得区域计数,并进行 reduce 来获得你的总和。
简而言之
const byName = groupBy(input.filter(it => it.Selcted), it => it['Version Name'])
const output = Object.keys(byName).map(name => {
const byZone = groupBy(byName[name], it => it.Zone)
const sum = byName[name].reduce((acc, it) => acc + it.Value, 0)
return {
'Version Name': name,
ZoneCount: Object.keys(byZone).length,
ValueSum: sum
}
})
不要忘记,您需要在“版本名称”周围加上引号才能将其用作 key 。
这是您的数据集的工作示例。
function groupBy(a, keyFunction) {
const groups = {};
a.forEach(function(el) {
const key = keyFunction(el);
if (key in groups === false) {
groups[key] = [];
}
groups[key].push(el);
});
return groups;
}
const input = [{
Selcted: false,
'Version Name': "aaa",
Zone: "11111",
Value: 5
},
{
Selcted: false,
'Version Name': "aaa",
Zone: "11111",
Value: 10
},
{
Selcted: true,
'Version Name': "aaa",
Zone: "11111",
Value: 15
},
{
Selcted: true,
'Version Name': "aaa",
Zone: "11111",
Value: 20
},
{
Selcted: true,
'Version Name': "aaa",
Zone: "22222",
Value: 25
},
{
Selcted: true,
'Version Name': "bbb",
Zone: "22222",
Value: 30
},
{
Selcted: true,
'Version Name': "bbb",
Zone: "22222",
Value: 35
},
{
Selcted: true,
'Version Name': "bbb",
Zone: "2222",
Value: 40
}
]
const byName = groupBy(input.filter(it => it.Selcted), it => it['Version Name'])
const output = Object.keys(byName).map(name => {
const byZone = groupBy(byName[name], it => it.Zone)
const sum = byName[name].reduce((acc, it) => acc + it.Value, 0)
return {
'Version Name': name,
ZoneCount: Object.keys(byZone).length,
ValueSum: sum
}
})
console.log(output)
关于javascript - 分组依据、不同计数、JavaScript 数组中对象的总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51971373/