I have array of object
JavaScript
x
7
1
const users = [
2
{ group: 'editor', name: 'Adam', age: 23 },
3
{ group: 'admin', name: 'John', age: 28 },
4
{ group: 'editor', name: 'William', age: 34 },
5
{ group: 'admin', name: 'Oliver', age: 28' }
6
];
7
Expected result:
JavaScript
1
12
12
1
//sum
2
sumAge = {
3
editor: 57, // 23+34
4
admin: 56 // 28+28
5
}
6
7
//average
8
avgAge = {
9
editor: 28.5, // (23+34) / 2
10
admin: 28 //(28+28)/2
11
}
12
I use reduce()
method to group the objects in an array by ‘group’ and calulate sum:
JavaScript
1
7
1
let sumAge = users.reduce((group, age) => {
2
group[age.group] = (group[age.group] || 0) + age.age || 1;
3
return group;
4
}, {})
5
console.log('sumAge', sumAge); // sumAge: {editor: 57, admin: 56}
6
done!
7
How to group object of Array by key ‘group’ and calulate average?. I tried:
JavaScript
1
23
23
1
let ageAvg= users.reduce((group, age) => {
2
if (!group[age.group]) {
3
group[age.group] = { age, count: 1 }
4
return group;
5
}
6
group[age.group].age+= age.age;
7
group[age.group].count += 1;
8
return group;
9
}, {})
10
const result = Object.keys(ageAvg).map(function(x){
11
const item = ageAvg[x];
12
return {
13
group: item.group,
14
ageAvg: item.age/item.count,
15
}
16
})
17
console.log('result',result);
18
/*
19
result=[
20
{group: "editor", ageAvg: 28.5}
21
{group: "admin", ageAvg: 28}
22
]
23
But Expected result:
JavaScript
1
5
1
result = {
2
editor: 28.5, // (23+34) / 2
3
admin: 28 //(28+28)/2
4
}
5
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:
JavaScript
1
39
39
1
const users = [{
2
group: 'editor',
3
name: 'Adam',
4
age: 23
5
},
6
{
7
group: 'admin',
8
name: 'John',
9
age: 28
10
},
11
{
12
group: 'editor',
13
name: 'William',
14
age: 34
15
},
16
{
17
group: 'admin',
18
name: 'Oliver',
19
age: 28
20
}
21
];
22
23
const sumId = users.reduce((a, {
24
group,
25
age
26
}) => (a[group] = (a[group] || 0) + age, a), {});
27
28
console.log(sumId); //{editor: 57, admin: 56}
29
30
//Average
31
const getAvg = (x) => {
32
const item = {}
33
const count = Object.keys(x).length
34
Object.keys(x).map(function(y) {
35
item[y] = sumId[y] / count
36
})
37
return item
38
}
39
console.log(getAvg(sumId)); //{editor: 28.5, admin: 28}