简体   繁体   中英

How to calculate average rating of an array?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM