I have a set of data like this:
[
{
name:'Bart',
classes:['Maths','Philosophy','Music']
},
{
name:'Lisa',
classes: ['Maths','Literature','Music']
},
{
name:'Maggie',
classes: ['Quantum Physics','Literature']
}
]
And I would like to output an array like
[
{ "name": "Maths", "count": 2 },
{ "name": "Music", "count": 2 },
{ "name": "Literature", "count": 2 },
{ "name": "Quantum Physics", "count": 1 },
{ "name": "Philosophy", "count": 1 }
]
What would be the optimal way to do it in ES6? Thanks in advance!
Edit: my attempt
let mappedArray = Array.map(item => item.classes)
let flattenedArray = mappedArray.reduce(
( accumulator, currentValue ) => accumulator.concat(currentValue),
[]
);
let countedArray = flattenedArray.reduce(function (allClasses, item) {
if (item in allClasses) {
allClasses[item]++;
}
else {
allClasses[item] = 1;
}
return allClasses;
}, {});
return countedArray