使用 Underscore/Lodash 分组和求和 [英] Group By and Sum using Underscore/Lodash
问题描述
我有这样的 JSON:
<预><代码>[{平台ID:1,支出:15,人数:4},{平台ID:1,支出:12,人数:3},{平台ID:2,支出:6,人数:5},{平台ID:2,支出:10,人数:1},]我想按 platformId
与 payout
和 numOfPeople
的总和对其进行分组.
即结果我想要这样的 JSON:
<预><代码>[1":{支出:27,人数:7},2":{支出:16,人数:6}]我尝试使用 underscore.js
的 _.groupBy
方法,它可以很好地分组,但是如何像我演示的那样获取对象属性值的总和以上?
你可以不用下划线:
var 结果 = data.reduce(function(acc, x) {var id = acc[x.platformId]如果(身份证){id.payout += x.payoutid.numOfPeople += x.numOfPeople} 别的 {acc[x.platformId] = x删除 x.platformId}返回acc},{})
但是你为什么想要一个带有数字键的对象呢?您可以将其转换回集合:
var toCollection = function(obj) {返回 Object.keys(obj).sort(function(x, y){return +x - +y}).map(function(k){return obj[k]})}toCollection(结果)
注意对象是变异的,所以如果你想维护原始数据,你可以先克隆它们.
I have JSON like this:
[
{
platformId: 1,
payout: 15,
numOfPeople: 4
},
{
platformId: 1,
payout: 12,
numOfPeople: 3
},
{
platformId: 2,
payout: 6,
numOfPeople: 5
},
{
platformId: 2,
payout: 10,
numOfPeople: 1
},
]
And I want to Group it by platformId
with sum of payout
and numOfPeople
.
I.e. in result I want JSON like this:
[
"1": {
payout: 27,
numOfPeople: 7
},
"2": {
payout: 16,
numOfPeople: 6
}
]
I tried to use underscore.js
's _.groupBy
method, and it groups fine, but how I can get the SUM of objects properties values like I demonstrated above?
You can do this without Underscore:
var result = data.reduce(function(acc, x) {
var id = acc[x.platformId]
if (id) {
id.payout += x.payout
id.numOfPeople += x.numOfPeople
} else {
acc[x.platformId] = x
delete x.platformId
}
return acc
},{})
But why would you want an object with numeric keys? You could convert it back to a collection:
var toCollection = function(obj) {
return Object.keys(obj)
.sort(function(x, y){return +x - +y})
.map(function(k){return obj[k]})
}
toCollection(result)
Note that objects are mutated, so you may to clone them first if you want to maintain the original data.
这篇关于使用 Underscore/Lodash 分组和求和的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!