Как получить среднее из массива объектов - PullRequest
0 голосов
/ 26 сентября 2018

Ниже я воспроизвожу свой код для расчета среднего рейтинга продуктов.

3 + 4 + 5 + 2/4 должен быть равен 3,5.Но это не дает мне правильный вывод.Что не так с моим кодом?

const ratings = [
  {food:3},
  {food:4},
  {food:5},
  {food:2}
];

let food = 0;

ratings.forEach((obj,index)=>{
  food = (food + obj.food)/++index
})

console.log("FOOD",food)

Ответы [ 6 ]

0 голосов
/ 26 сентября 2018

То, что вы делаете, это 3/1 + 4/2 + 5/3 + 2/4, что не эквивалентно 3/4 + 4/4 + 5/4 + 2/4.То, что вы можете сделать, это:

ratings.forEach((obj,index)=>{
    food = (food + obj.food)
});

food = food / ratings.length;

console.log("FOOD",food)

Если вы занимаетесь функциональным образом, я бы использовал функцию Reduce для получения результата.

const food = ratings.reduce((sum, { food }) => sum + food, 0) / ratings.length;

console.log("FOOD", food)
0 голосов
/ 26 сентября 2018

Несмотря на наличие нескольких ответов, я хотел бы добавить свою фокусировку для улучшения качества кода:

  1. Вы можете использовать деструктуризацию в forEach(), чтобы просто получить свойство food объекта какэто только то свойство, которое вас интересует.
  2. Несмотря на деление внутри цикла, после завершения цикла у нас может быть только одна операция деления.Это экономит много вычислений, когда массив огромен (тысячи объектов)
  3. Вы можете использовать короткую руку как += в цикле для суммирования значения.
  4. Вы можете сделатьоднострочный код в forEach()

const ratings = [
  {food:3},
  {food:4},
  {food:5},
  {food:2}
];

let foodTotal = 0;
let length = ratings.length;
ratings.forEach(({food})=> foodTotal += food);

console.log("FOOD",foodTotal/length);
0 голосов
/ 26 сентября 2018

Вот еще одно решение с использованием .reduce ()

const ratings = [
  {food: 3},
  {food: 4},
  {food: 5},
  {food: 2}
]
const average = ratings.reduce((a, b) => {
  return {food: a.food + b.food}
}).food / ratings.length

console.log('FOOD', average)
0 голосов
/ 26 сентября 2018

Вы бы использовали уменьшить до суммы, а затем просто поделить на длину рейтинга

const ratings = [
  {food:3},
  {food:4},
  {food:5},
  {food:2}
];

const avg = ratings.reduce((a, {food}) => a + food, 0) / ratings.length;
console.log(avg);
0 голосов
/ 26 сентября 2018

Вам нужно разделить на количество элементов после того, как вы их суммировали

const ratings = [
    {food:3},
    {food:4},
    {food:5},
    {food:2}
];

let food = 0;

ratings.forEach((obj,index)=>{
    food = (food + obj.food)
});

food = food / ratings.length;

console.log("FOOD",food)
0 голосов
/ 26 сентября 2018

Вам необходимо добавить относительный вклад в среднее значение каждого продукта.

Поскольку среднее значение - это сумма предметов / количество предметов в вашем случае, это

(3+4+5+2) / 4

Что мы можемразделить на

3/4 + 4/4 + 5/4 + 2/4

const ratings = [{"food":3},{"food":4},{"food":5},{"food":2}];

let food = 0;

ratings.forEach((obj) => {
  food = food + obj.food / ratings.length;
})

console.log("FOOD", food)

Вы также можете использовать Array.reduce(), чтобы немного сократить код:

const ratings = [{"food":3},{"food":4},{"food":5},{"food":2}];

const food = ratings.reduce((r, { food }) => 
  r + food
, 0) / ratings.length;

console.log("FOOD", food)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...