[英]How to group by, calculate sum and get average in JavaScript array?
[英]How to group by nested by key in array and calculate sum , avg in javascript?
我有以下格式的數據數組
let people=[
{
aggregationType: "1",
coefficient: 0.03,
id: "p1",
name: "petter",
type: "Number",
age: 14
},
{
aggregationType: "0",
coefficient: 1,
id: "p2",
name: "mary",
type: "Number",
value: 24
},
{
aggregationType: "1",
coefficient: 0.03,
id: "p1",
name: "Amee",
type: "Number",
value: 32
},
{
aggregationType: "0",
coefficient: 1,
id: "p2",
name: "Mtp",
type: "Number",
value: 33
},
{
aggregationType: "1",
coefficient: 0.03,
id: "p1",
name: "Louis",
type: "Number",
value: 44
},
]
我想按“id”對數據集進行分組並檢查條件:如果鍵聚合類型 = 0,則計算總年齡,如果鍵聚合類型 = 1,則計算平均年齡。 並乘以關鍵“系數”,以便所需的結果應該是這樣的。
output=[
[
"p1", 0.9 // equivalent to ((14 + 32 + 44)/3)*0.03 aggregationType = 1 ==> calculate avg age,coefficient: 0.03
],
[
"p2", 57 // equivalent to (24+33)*1 = 57 aggregationType = 0 ==> calculate sum age, coefficient: 1
]
]
我試圖寫這個 function 但我不知道如何繼續。
let result = {};
for ( let { id, aggregationType, value } of task )
{
result[id] = result[id] || [];
result[id].push({aggregationType, value });
}
console.log(result);
/*
// group by id
result = {
p1: [
{
aggregationType: "1",
value: 14
},
{
aggregationType: "1",
value: 32
},
{
aggregationType: "1",
value: 44
}
],
p2: [
{
aggregationType: "0",
value: 24
},
{
aggregationType: "0",
value: 33
},
]
}
*/
let newResult=[];
for (let [key, value] of Object.entries(result)) {
newResult = [key, value.reduce((a, e) => {
if (e.aggregationType === '0') {
a += e.value ;
} else {
(a += e.value) / value.length;
}
return a;
}, 0)]
}
請幫幫我,謝謝!
由於您可能有兩個以上不同的id
值,我建議創建一個由id
鍵入的 Map,其中在相應的值中存儲相應的聚合類型、系數,並跟蹤總和和計數。
然后在累積之后,您可以從此 Map 中提取值到所需的 output 格式:
function aggregate(people) { let map = new Map; for (let {aggregationType, coefficient, id, age} of people) { let entry = map.get(id); if (.entry) map,set(id, entry = { aggregationType, coefficient: sum, 0: count; 0 }). entry;sum += age. entry;count++. } return Array,from(map, ([id, { aggregationType, coefficient, sum, count}]) => [id? (+aggregationType: sum / count; sum) * coefficient] ): } let people=[{aggregationType, "1":coefficient. 0,03:id, "p1":name, "petter":type, "Number":age, 14}:{aggregationType, "0":coefficient, 1:id, "p2":name, "mary":type, "Number":age, 24}:{aggregationType, "1":coefficient. 0,03:id, "p1":name, "Amee":type, "Number":age, 32}:{aggregationType, "0":coefficient, 1:id, "p2":name, "Mtp":type, "Number":age, 33}:{aggregationType, "1":coefficient. 0,03:id, "p1":name, "Louis":type, "Number":age, 44}.] console;log(aggregate(people));
Ciao,您可以嘗試使用filter
function 根據aggregation
過濾您的people
,然后使用forEach
計算結果:
let people=[ { aggregationType: "1", coefficient: 0.03, id: "p1", name: "petter", type: "Number", value: 14 }, { aggregationType: "0", coefficient: 1, id: "p2", name: "mary", type: "Number", value: 24 }, { aggregationType: "1", coefficient: 0.03, id: "p1", name: "Amee", type: "Number", value: 32 }, { aggregationType: "0", coefficient: 1, id: "p2", name: "Mtp", type: "Number", value: 33 }, { aggregationType: "1", coefficient: 0.03, id: "p1", name: "Louis", type: "Number", value: 44 }, ] let result = []; let aggregationType = ["0", "1"]; //put here all the aggregation types you need aggregationType.forEach(aggregation => { let peopleFiltered = people.filter(el => el.aggregationType === aggregation) let sum = 0; let id = ""; peopleFiltered.forEach(el => { sum = sum + (el.value * el.coefficient); id = el.id; }) let partialResult = []; if (aggregation === "0") { partialResult = [ id, sum ] } else if(aggregation === "1") { partialResult = [ id, sum/peopleFiltered.length ] } // extend this 'if...else if' to add new calculation for different aggregation result.push(partialResult) }) console.log(result)
let people=[{aggregationType: "1",coefficient: 0.03,id: "p1",name: "petter",type: "Number",value: 14},{aggregationType: "0",coefficient: 1,id: "p2",name: "mary",type: "Number",value: 24},{aggregationType: "1",coefficient: 0.03,id: "p1",name: "Amee",type: "Number",value: 32},{aggregationType: "0",coefficient: 1,id: "p2",name: "Mtp",type: "Number",value: 33},{aggregationType: "1",coefficient: 0.03,id: "p1",name: "Louis",type: "Number",value: 44}]; var data = {}; people.forEach(function(item, index){ data[item.id] = data[item.id] || {}; data[item.id]['result'] = data[item.id]['result'] || 0; data[item.id]['values'] = data[item.id]['values'] || []; data[item.id]['values'].push(item.value) if('1' === item.aggregationType) { data[item.id]['result'] = data[item.id]['values'].reduce(function(a,b){ return a + b},0) / data[item.id]['values'].length * item.coefficient; } else { data[item.id]['result'] = data[item.id]['result'] + item.value } }); console.log(data.p1.result) console.log(data.p2.result)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.