javascript - 如何计算数组的平均评分?
问题描述
下面给出了一个数组数据:
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}
];
解决方案
这是一个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);
推荐阅读
- git - 克隆 git 存储库并将所有者包含在文件夹结构中
- node.js - model:generate 给出“缺少必需的参数:名称、属性”
- android - Gradle 无法使用 JCenter 构建(使用 Unity + Firebase)
- ssl - 为特定 CA 安装证书,或了解现有证书为何不起作用
- docker - docker run --name vs --hostname 作为命令行选项的区别(ping:错误地址)
- objective-c - OS X - 应用程序无法打开,因为当捆绑包包含新版本的第三方可执行文件时无法确认开发者的身份
- azure - Azure 容器实例传出 IP 范围
- android - Android 架构组件:LiveData as Service 观察者
- javascript - 将 JSON 值动态传递给另一个模板
- vb.net - VB.net 平铺图形绘图 - 等距