簡體   English   中英

如何按數組中的鍵嵌套分組並計算javascript中的總和,平均值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM