如何从对象数组中获得平均值

问题描述 投票:1回答:6

下面我重现我的代码来计算食物的平均评级。

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)

任何帮助!

提前致谢!

javascript ecmascript-6
6个回答
3
投票

尽管有几个答案,我想补充我的重点,以提高代码质量:

  1. 您可以在forEach()中使用destructuring来获取对象的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);

1
投票

你可以使用reduce来求和,然后简单地除以等级的长度

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

const avg = ratings.reduce((a, {food}) => a + food, 0) / ratings.length;
console.log(avg);

1
投票

将它们相加后,需要除以元素数

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)

1
投票

您需要添加每种食物平均值的相对贡献。

因为平均值是 - 你的情况下的项目总数/项目数量

(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)

1
投票

这是另一个使用.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
投票

你在做什么的是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)
© www.soinside.com 2019 - 2024. All rights reserved.