繁体   English   中英

如何在 JavaScript 数组中分组、计算总和并获得平均值?

[英]How to group by, calculate sum and get average in JavaScript array?

我有一系列 object

 const users = [
     { group: 'editor', name: 'Adam', age: 23 },
     { group: 'admin', name: 'John', age: 28 },
     { group: 'editor', name: 'William', age: 34 },
     { group: 'admin', name: 'Oliver', age: 28' }
 ];

预期结果:

//sum
 sumAge = {
 editor: 57,  // 23+34
 admin: 56    // 28+28
}

//average
avgAge = {
   editor: 28.5,  // (23+34) / 2
   admin: 28    //(28+28)/2
}

我使用reduce()方法按“组”对数组中的对象进行分组并计算总和:

let sumAge = users.reduce((group, age) => {
    group[age.group] = (group[age.group] || 0) + age.age || 1;
    return group;
}, {})
console.log('sumAge', sumAge); // sumAge: {editor: 57, admin: 56} 
done!

如何按“组”键对数组的 object 进行分组并计算平均值? 我试过了:

let ageAvg= users.reduce((group, age) => {
      if (!group[age.group]) {
      group[age.group] = { ...age, count: 1 }
         return group;
      }
      group[age.group].age+= age.age;
      group[age.group].count += 1;
      return group;
      }, {})
const result = Object.keys(ageAvg).map(function(x){
     const item  = ageAvg[x];
     return {
         group: item.group,
         ageAvg: item.age/item.count,
     }
 })
console.log('result',result);
/*
result=[
    {group: "editor", ageAvg: 28.5}
    {group: "admin", ageAvg: 28}
]

但预期结果:

result = {
   editor: 28.5,  // (23+34) / 2
   admin: 28    //(28+28)/2
}

您可以简单地使用reduce来获取age groupstotal

并使用object.keys长度getAvg function 中获取新 object 的平均值。

演示:

 const users = [{ group: 'editor', name: 'Adam', age: 23 }, { group: 'admin', name: 'John', age: 28 }, { group: 'editor', name: 'William', age: 34 }, { group: 'admin', name: 'Oliver', age: 28 } ]; const sumId = users.reduce((a, { group, age }) => (a[group] = (a[group] || 0) + age, a), {}); console.log(sumId); //{editor: 57, admin: 56} //Average const getAvg = (x) => { const item = {} const count = Object.keys(x).length Object.keys(x).map(function(y) { item[y] = sumId[y] / count }) return item } console.log(getAvg(sumId)); //{editor: 28.5, admin: 28}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM