그룹 별 및 합계 Underscore / Lodash를 사용하여
-
21-12-2019 - |
문제
나는 JSON이 다음과 같이 가지고있다 :
[
{
platformId: 1,
payout: 15,
numOfPeople: 4
},
{
platformId: 1,
payout: 12,
numOfPeople: 3
},
{
platformId: 2,
payout: 6,
numOfPeople: 5
},
{
platformId: 2,
payout: 10,
numOfPeople: 1
},
]
.
그리고 platformId
및 payout
의 합계로 numOfPeople
로 그룹화하려고합니다.
i.e.결과적으로 JSON이 다음과 같이 원한다 :
[
"1": {
payout: 27,
numOfPeople: 7
},
"2": {
payout: 16,
numOfPeople: 6
}
]
.
underscore.js
의 _.groupBy
메소드를 사용하려고 시도했으며, IT 그룹이 괜찮아요.
해결책
밑줄 없이이 작업을 수행 할 수 있습니다.
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
},{})
.
그러나 숫자 키가있는 객체를 왜 원하십니까?컬렉션으로 다시 변환 할 수 있습니다.
var toCollection = function(obj) {
return Object.keys(obj)
.sort(function(x, y){return +x - +y})
.map(function(k){return obj[k]})
}
toCollection(result)
.
오브젝트가 돌연변이되므로 원래 데이터를 유지하려는 경우 먼저 복제 할 수 있습니다.
다른 팁
여기에 이러한 종류의 문제에 대한 Lodash 솔루션입니다.그것은 밑줄과 비슷하지만 몇 가지 고급 기능이 있습니다.
const data = [{
platformId: 1,
payout: 15,
numOfPeople: 4
},
{
platformId: 1,
payout: 12,
numOfPeople: 3
},
{
platformId: 2,
payout: 6,
numOfPeople: 5
},
{
platformId: 2,
payout: 10,
numOfPeople: 1
},
];
const ans = _(data)
.groupBy('platformId')
.map((platform, id) => ({
platformId: id,
payout: _.sumBy(platform, 'payout'),
numOfPeople: _.sumBy(platform, 'numOfPeople')
}))
.value()
console.log(ans);
.
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>
.
나는 기능적인 방식으로 이것을하려고 노력했고 결과는 이렇게
console.log(_.chain(data)
.groupBy("platformId")
.map(function(value, key) {
return [key, _.reduce(value, function(result, currentObject) {
return {
payout: result.payout + currentObject.payout,
numOfPeople: result.numOfPeople + currentObject.numOfPeople
}
}, {
payout: 0,
numOfPeople: 0
})];
})
.object()
.value());
. Lodash One Liners의 정신
_.map(_.groupBy(your_list, 'group_by'), (o,idx) => { return { id: idx, summed: _.sumBy(o,'sum_me') }})
. a (내 의견으로) underscore.js를 사용하여 좋은 기능적인 방법 :
var sum = function(t, n) { return t + n; };
_.mapObject(
_.groupBy(data, 'platformId'),
function(values, platformId) {
return {
payout: _.reduce(_.pluck(values, 'payout'), sum, 0),
numOfPeople: _.reduce(_.pluck(values, 'numOfPeople'), sum, 0)
};
}
);
. //Input
[{
"platformId": 1,
"payout": 15,
"numOfPeople": 4
}, {
"platformId": 1,
"payout": 12,
"numOfPeople": 3
}, {
"platformId": 2,
"payout": 6,
"numOfPeople": 5
}, {
"platformId": 2,
"payout": 10,
"numOfPeople": 1
}]
//Output
{
"1": {
"payout": 43,
"numOfPeople": 13
},
"2": {
"payout": 43,
"numOfPeople": 13
}
}
// Code
output = _.reduce(input, function(acc, val, key) {
acc[val.platformId] = {
payout: _.sum(a, 'payout'),
numOfPeople: _.sum(a, 'numOfPeople')
};
return acc;
}, {});
. 제휴하지 않습니다 StackOverflow