Поскольку вы уже разделены на 2 ожидаемая рейтинговая система от 10 до 5 звездочек - вам нужно вернуть , умножить звездочек на 2, чтобы вернуться к 10 система.
// Convert 1-5 rating stars to 1-10 rating
const stars_to_ten = stars =>
Math.round(stars.reduce((ten, star) => (ten += star * 2, ten), 0) / stars.length);
let result1 = stars_to_ten(['4', '5', '1', '2', '5', '5', '2', '1', '3', '3', '4']);
let result2 = stars_to_ten(['5', '5', '5', '5', '5']);
console.log(result1); // 6
console.log(result2); // 10
IMDB взвешивает свой рейтинг по другим нераскрытым факторам - так что, возможно, это не среднее или медиана числа отданных голосов, поэтому взвешенный алгоритм может быть все еще используется.
Взвешенный рейтинг по истинной байесовской оценке
(WR) = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C
Где:
R = среднее значение для Mov ie (среднее) = (рейтинг)
v = количество голосов за MOV ie = (голосов)
m = минимальное количество голосов, необходимых для включения в список 250 лучших (в настоящее время 25000)
C = среднее количество голосов по всему отчету (в настоящее время 7,0)
const bayesianWeighted = (avg, totVotes, minVotesTop = 10, mean = 7.0) =>
(avg * totVotes + mean * minVotesTop) / (totVotes + minVotesTop);
const calcRating = stars => {
const avg = stars.reduce((a, v) => (a += +v * 2, a), 0) / stars.length;
return Number(bayesianWeighted(avg, stars.length).toFixed(1));
};
// TEST
[
[4, 5, 1, 2, 5, 5, 2, 1, 3, 3, 4], // 6.7
[1, 1, 1, 1, 1], // 5.3
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], // 4.5
[5, 5, 5, 5, 5], // 8
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5], // 8.5
].forEach(r => console.log(calcRating(r)));