我有一個物件陣列,如下所示。
我想將具有相同bank, gender,age和的那些分組state在一起。
我想分別將它們的和加在一起,并計算每個組。(不包括在輸出中)depositAmountwithdrawalAmountuser
示例陣列
[{
"bank": "bank1",
"user": "u1",
"depositAmount": 12,
"withdrawalAmount": 33,
"gender": "male",
"age": 38,
"state": "Arizona"
},
{
"bank": "bank1",
"user": "u2",
"depositAmount": 25,
"withdrawalAmount": 44,
"gender": "male",
"age": 38,
"state": "Arizona"
},
{
"bank": "bank2",
"user": "u3",
"depositAmount": 10,
"withdrawalAmount": 0,
"gender": "male",
"age": 38,
"state": "Florida"
}]
預期產出
[{
"bank": "bank1"
"depositAmount": 27,
"withdrawalAmount": 77,
"gender": "male",
"age": 38,
"state": "Arizona"
"count": 2
},
{
"bank": "bank2"
"depositAmount": 10,
"withdrawalAmount": 0,
"gender": "male",
"age": 38,
"state": "Florida"
"count": 1
}]
uj5u.com熱心網友回復:
這個問題的一個通用解決方案是為“它分組、合并和聚合”任務實作一個可配置的減速器功能。
為了滿足 OP 的要求,提供了一個相應定制的自定義收集器物件作為reduce-method 的初始值。
通用 reducer 期望提供 a createKey、 acreateMerger和一個aggregate函式以及一個Mapbasedlookup和一個空result陣列,后者一旦運行 reduce 任務,將保存所有分組/合并和聚合的物件。
至于OP的具體要求,提供的功能是......
歐...
“我想將具有相同
bank,gender,age和的人分組state在一起。”createKey: ({ bank, gender, age, state }) => [bank, gender, age, state].join('_')
歐...
“我想分別將它們的和加在一起,并計算每個組。(不包括在輸出中)。”
depositAmountwithdrawalAmountusercreateMerger: ({ bank, gender, age, state }) => ({ bank, gender, age, state, count: 0, depositAmount: 0, withdrawalAmount: 0 })aggregate: (merger, { depositAmount, withdrawalAmount }) => { merger.count; merger.depositAmount = depositAmount; merger.withdrawalAmount = withdrawalAmount; }
function groupMergeAndAggregateGenerically(collector, item) {
const {
createKey, createMerger, aggregate,
lookup, result = [],
} = collector;
const key = createKey(item);
let merger = lookup.get(key) ?? null;
if (merger === null) {
merger = createMerger(item);
lookup.set(key, merger);
result.push(merger);
}
aggregate(merger, item);
return collector;
}
const sampleData = [{
"bank": "bank1",
"user": "u1",
"depositAmount": 12,
"withdrawalAmount": 33,
"gender": "male",
"age": 38,
"state": "Arizona"
}, {
"bank": "bank1",
"user": "u2",
"depositAmount": 25,
"withdrawalAmount": 44,
"gender": "male",
"age": 38,
"state": "Arizona"
}, {
"bank": "bank2",
"user": "u3",
"depositAmount": 10,
"withdrawalAmount": 0,
"gender": "male",
"age": 38,
"state": "Florida"
}];
// OP: I would like to group those with the same
// `bank`, `gender`, `age`, and `state` together.
const createKey = ({ bank, gender, age, state }) =>
[bank, gender, age, state].join('_');
// OP: I'd like to sum their `depositAmount` and
// `withdrawalAmount` together, respectively, and
// `count` each group as well. (`user` is excluded in the output).
const createMerger = ({ bank, gender, age, state }) => ({
bank, gender, age, state, count: 0, depositAmount: 0, withdrawalAmount: 0,
});
const aggregate = (merger, { depositAmount, withdrawalAmount }) => {
merger.count;
merger.depositAmount = depositAmount;
merger.withdrawalAmount = withdrawalAmount;
};
const { result: mergedData } = sampleData
.reduce(groupMergeAndAggregateGenerically, {
createKey,
createMerger,
aggregate,
lookup: new Map,
result: [],
});
console.log({ mergedData });
.as-console-wrapper { min-height: 100%!important; top: 0; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/483567.html
標籤:javascript 数组 目的 合并 分组
上一篇:我不明白64美元從何而來
