Нахождение среднего значения после замены текущего значения - PullRequest
0 голосов
/ 02 июля 2019

Не уверен, почему возникает эта проблема, но по какой-то причине я получаю неправильный вывод.То, что я пытаюсь сделать, это взять существующее среднее количество оценок и создать новое.В данный момент я решаю вопрос, когда пользователь, который уже рассчитал среднее значение, должен изменить свое значение.

Например:

User A rates at 5 stars
User B rates at 3 stars
User C rates at 5 star

Текущее среднее число звезд: 13/3или 4.333

Теперь, если пользователь B меняет свой рейтинг, и я не хочу циклически проходить все рейтинги, я просто хочу сказать:

Учитывая, что я знаю, что есть 3 рейтинга ия меняю пользователя C на 3, тогда я предположил бы, что могу сделать:

13-5 = 8
8 + 3 = 11
11/3 = new average 3.667

var originalRatingVal = originalRating.rating ? originalRating.rating.stars : 0
var currentNumberOfRatings = currentItem.count ? currentItem.count.ratings : 0

var currentAverageTotal = currentNumberOfRatings * overall_rating
var oldNumberOfRatings = currentNumberOfRatings - 1
var newAverage = (currentAverageTotal - originalRatingVal) - oldNumberOfRatings

var newRatingVal = currentRating.rating ? currentRating.rating.stars : 0
var newNumRatings = oldNumberOfRatings + 1;
var oldRatingTotal = newAverage * oldNumberOfRatings;
var newAvgRating = (oldRatingTotal + newRatingVal) / newNumRatings;

Кажется, это не работает:

Если я изменю пользователя B на5, ожидая, что newAvgRating равняется 5, в настоящее время он равен 5.666666666666667.

Любые идеи будут чрезвычайно признательны, спасибо!

1 Ответ

0 голосов
/ 02 июля 2019

const ratings = [5, 3, 5];
const ratingsTotalled = ratings.reduce((a,b)=>a+b);
const originalAverage = ratingsTotalled/ratings.length;
console.log('original:', originalAverage);

//now, I want to remove a '5' rating
//and replace it with '3'

const alteredTotal = ratingsTotalled - 5 + 3;
const alteredAverage = alteredTotal/ratings.length;

console.log('altered:', alteredAverage);

Другими словами:

const originalRatings = {
  a: 5,
  b: 3,
  c: 5,
}
const ratings = Object.values(originalRatings);
const ratingsTotalled = ratings.reduce((a,b)=>a+b);
const originalAverage = ratingsTotalled/ratings.length;
console.log('original:', originalAverage);

//now, I want to remove a '5' rating
//and replace it with '3'
const cAlteredRating = 3;
const alteredTotal = ratingsTotalled - originalRatings.c + cAlteredRating;
const alteredAverage = alteredTotal/ratings.length;

console.log('altered:', alteredAverage);
...