Flutter - 如何计算列表中数据的平均值?

19

我有一个来自用户的食品评论列表List<Comment>。 它看起来像这样:

[
    {userId: 1,
     rating: 4.5
    },
    {userId: 2,
     rating: 4.0
    },
    {userId: 3,
     rating: 3.5
    },
    {userId: 4,
     rating: 3.0
    }

   ...
];

我想要获得平均评分。AVERAGE = 评分总数 : 用户总数,我该如何在Dart中应用这个公式?

3个回答

31
  var values = [
    {'userId': 1, 'rating': 4.5},
    {'userId': 2, 'rating': 4.0},
    {'userId': 3, 'rating': 3.5},
    {'userId': 4, 'rating': 3.0}
  ];

  var result = values.map((m) => m['rating']).reduce((a, b) => a + b) / values.length;
  print(result);

没有人能在 JSON 相关的问题上打败你。 - CopsOnRoad
嗨 @Günter Zöchbauer,如果我想将列表按最高评分排序,该怎么办? - Muhammad Imanudin
只限于电话上。应该有一个关于如何按值对Map进行排序的问题,并在其中解释。 - Günter Zöchbauer
1
此答案已过时。请在此处查看更好的解决方案https://dev59.com/5FQJ5IYBdhLWcg3wKihi#69660580 - tmaihoff

29

在2021年,Dart内置了来自collection包的average方法,它可以用于Iterable

import 'package:collection/collection.dart';

void main() {
 var values = [
    {'userId': 1, 'rating': 4.5},
    {'userId': 2, 'rating': 4.0},
    {'userId': 3, 'rating': 3.5},
    {'userId': 4, 'rating': 3.0}
  ];

  var result = values.map((m) => m['rating']!).average; 

  print(result); // prints 3.75
}

你可能也会对同一个包中的.sum方法感兴趣。


1
我通过使用fold函数将值相加,然后除以总数来实现这一点。以下是一个示例:
var values = [
    {'userId': 1, 'rating': 4.5},
    {'userId': 2, 'rating': 4.0},
    {'userId': 3, 'rating': 3.5},
    {'userId': 4, 'rating': 3.0}
];

List<double> ratings = values.map((e) => e.price!).toList();
double sum = ratings.fold(0, (p, c) => p + c);
if (sum > 0) {
   double average = sum / ratings.length;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接