calculate 5 star ratings in js array of object

I have an array that consist of feedback objects. Each object is a user feedback left for a product:

Array [ {…}, {…} ]
0: Object { id: "1223", quality: 3, material: 4, … }
1: Object { id: "7342", quality: 3, material: 5, … }
...

Users can leave feedback for each category quality, material, … out of 5.

I want to use the weighted average so on my site, I can show for example:

quality: 3
material: 4

This is weighted average calculated by this formula:

quality: (5*0 + 4*0 + 3*2 + 2*0 + 1*0) / (2) = 3
material: (5*1 + 4*0 + 3*1 + 2*0 + 1*0) / (2) = 4

I want to add this my js project, so I loop through all feedback:

const total = []
const feedback = [{
    id: "1223",
    quality: 3,
    material: 4,
  },
  {
    id: "7342",
    quality: 3,
    material: 5,
  }
];
feedback.forEach(function(arrayItem) {
  const score = arrayItem.quality
  total.push(score)
})
console.log(total.reduce((partialSum, a) => partialSum + a, 0))

I am confused about how to do the calculation for each star, for example to get number of 1s, 2s, 3s, 4s, and 5 starts. How can I modify my code to return the rating result?

>Solution :

You could collect all sums in an object and calculate the aveage on the fly.

If you need an array, take only the values.

const
    feedback = [{ id: "1223", quality: 3, material: 4 }, { id: "7342", quality: 3, material: 5 }],
    types = ['quality', 'material'],
    result = feedback.reduce((r, o) => {
        types.forEach(type => {
            r[type] ??= { type, total: 0, count: 0 };
            r[type].total += o[type];
            r[type].avarage = r[type].total / ++r[type].count;
        });
        return r;
    }, {});

console.log(result);
console.log(Object.values(result));
.as-console-wrapper { max-height: 100% !important; top: 0; }

Leave a Reply