# How to group by, calculate sum and get average in JavaScript array?

I have array of 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' }
];
```

Expected result:

```//sum
sumAge = {
editor: 57,  // 23+34
}

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

I use `reduce()` method to group the objects in an array by ‘group’ and calulate sum:

```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!
```

How to group object of Array by key ‘group’ and calulate average?. I tried:

```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}
]
```

But Expected result:

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

You could simply use `reduce` to get the `total` of `age groups`.

And use `object.keys` length to get the average of your total as new object from `getAvg` function.

Demo:

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

const sumId = users.reduce((a, {
group,
age
}) => (a[group] = (a[group] || 0) + age, a), {});

//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
}