There is an array data given below:
const ratingData = [
{name: 'St. Marys School', rating:5},
{name: 'St. Zaviers School', rating:4},
{name: 'St. Marys School', rating:3},
{name: 'Rahul English Medium School', rating:2},
{name: 'St. Francis High School', rating:3},
{name: 'Rahul English Medium School', rating:1},
{name: 'St. Francis High School', rating:4},
{name: 'Mother Marys High School', rating:5}
];
In this array, I want to calculate an average rating of each School Data. But the problem is duplicate entries like there are 2 entries for "St. Mary's School" with different ratings. How can I combine into one and calculate its average Rating? I tried using the map
function but for each entry but it's not working.
It's o/p should look something like this. (It is just an example)
const output = [
{ name: 'St. Marys School', averageRating: 4},
{ name: 'St. Zaviers School', averageRating: 4},
{ name: 'Rahul English Medium School', averageRating: 1.5},
{ name: 'St. Francis High School', averageRating: 3.5},
{ name: 'Mother Marys High School', averageRating: 5}
];
Here is an example using reduce()
in combination with a Map
to detect duplicate entries.
First it reduces the original array to a Map
that accumulates the ratings of duplicate entries in an array.
{
{'St. Marys School': [5, 3, 1]},
{'St. Zaviers School': [4]},
...
}
We then convert this Map
back to an array using Array.from
and reducing the array of ratings to an average.
const ratingData = [ {name: 'St. Marys School', rating:5}, {name: 'St. Zaviers School', rating:4}, {name: 'St. Marys School', rating:3}, {name: 'Rahul English Medium School', rating:2}, {name: 'St. Francis High School', rating:3}, {name: 'Rahul English Medium School', rating:1}, {name: 'St. Francis High School', rating:4}, {name: 'Mother Marys High School', rating:5}, {name: 'St. Marys School', rating:1} ] const mapData = ratingData.reduce((acc, {name, rating}) => { const match = acc.get(name); match? match.push(rating): acc.set(name, [rating]); return acc; }, new Map); const averageArray = Array.from(mapData, ([name, ratings]) => { const rating = ratings.reduce((a, r) => (a + r))/ratings.length; return { name, rating } }); console.log(averageArray);
let ratingData = [
{name: 'St. Marys School', rating:5},
{name: 'St. Zaviers School', rating:4},
{name: 'St. Marys School', rating:3},
{name: 'Rahul English Medium School', rating:2},
{name: 'St. Francis High School', rating:3},
{name: 'Rahul English Medium School', rating:1},
{name: 'St. Francis High School', rating:4},
{name: 'Mother Marys High School', rating:5}
];
let sumData = {};
for (let element of ratingData) {
if (sumData[element.name]) {
sumData[element.name].sum = sumData[element.name].sum + element.rating;
sumData[element.name].n++;
} else {
sumData[element.name] = {
sum: element.rating,
n: 1
};
}
}
console.log('sumData: ' + JSON.stringify(sumData));
let averageData = [];
for (let element of Object.keys(sumData)) {
averageData.push({
name: element,
rating: sumData[element].sum / sumData[element].n
});
}
console.log('averageData: ' + JSON.stringify(averageData));
sumData is gonna be equal to
{
"St. Marys School": {
"sum": 8,
"n": 2
},
"St. Zaviers School": {
"sum": 4,
"n": 1
},
"Rahul English Medium School": {
"sum": 3,
"n": 2
},
"St. Francis High School": {
"sum": 7,
"n": 2
},
"Mother Marys High School": {
"sum": 5,
"n": 1
}
}
and average data is gonna be equal to
[
{
"name": "St. Marys School",
"rating": 4
},
{
"name": "St. Zaviers School",
"rating": 4
},
{
"name": "Rahul English Medium School",
"rating": 1.5
},
{
"name": "St. Francis High School",
"rating": 3.5
},
{
"name": "Mother Marys High School",
"rating": 5
}
]
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.