首页 > 解决方案 > 如何计算数组的平均评分?

问题描述

下面给出了一个数组数据:

    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}
    ];

在这个数组中,我想计算每个学校数据的平均评分。但问题是重复的条目,例如“St. Mary's School”有 2 个具有不同评级的条目。如何合并为一个并计算其平均评级?我尝试使用该map功能,但对于每个条目,但它不起作用。

它的 o/p 应该看起来像这样。(这只是一个例子)

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}
];

标签: javascriptarraysaverage

解决方案


这是一个reduce()与 a 结合使用Map来检测重复条目的示例。

首先,它将原始数组简化为一个Map累积数组中重复条目的评分的数组。

{
{'St. Marys School': [5, 3, 1]},
{'St. Zaviers School': [4]},
...
}

然后我们将其转换Map回一个数组,使用Array.from评级数组并将其减少为平均值。

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);


推荐阅读