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
admin: 56 // 28+28
}
//average
avgAge = {
editor: 28.5, // (23+34) / 2
admin: 28 //(28+28)/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}
{group: "admin", ageAvg: 28}
]
But Expected result:
result = {
editor: 28.5, // (23+34) / 2
admin: 28 //(28+28)/2
}
Advertisement
Answer
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',
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}