如何计算总和形式列表<地图>?



我正试图根据List<地图>。我有一个包含日期(月/年(和金额的地图列表,我想将其转换为一个地图列表,其中金额是每个日期所有"金额"的总和。

我想转换的当前列表看起来像

[{name: 8/2020, amount: 61606.50}, {name: 9/2020, amount: 18481.95}, {name: 9/2020, amount: 12937.36}, {name: 9/2020, amount: 9056.16}, {name: 9/2020, amount: 6339.31}, {name: 9/2020, amount: 4437.52}, {name: 9/2020, amount: 1725.70}, {name: 9/2020, amount: 1725.70}, {name: 8/2020, amount: 20535.50}, {name: 9/2020, amount: 68451.67}]

我想变成这样:

[{2020年8月:总计},{2020月9日:总计}]

我的代码:

List _list = [];
var map = Map();
var foodList = Provider.of<List<FoodItem>>(context);
var list = foodList.map((e) {
Map _map;
List _list;
_list = e.consumed.map((elo) {
DateTime date;
date = DateTime.fromMillisecondsSinceEpoch(elo['date']);
var test = DateFormat('yM').format(date);
double _price = e.price * elo['amount'];
_map = {
'name': test,
'amount': _price.toStringAsFixed(2),
};
return _map;
}).toList();
return _list;
}).toList();
list.forEach((e) => _list.addAll(e));
print(_list);
_list.forEach((x) {
var test;
test = x['name'];
return map[test] = !map.containsKey(test) ? (1) : (map[test] + 1);
});
if (map.isNotEmpty) print(map);

您可以在列表中使用fold来实现这一点:

final result = list.fold<Map<String, double>>({}, (rMap, element) {
final key = element['name'];
if (rMap[key] == null)
rMap[key] = 0;
rMap[key] += element['amount'];
return rMap;
});
print(result); // {8/2020: 82142, 9/2020: 123155.37}

我认为解决问题的最佳方法是使用集合包。有关更多详细信息和示例,请参阅此处。简而言之,这个包包含一个您正在寻找的函数groupBy(类似于SQL,它大大简化了对集合的处理(。

相关内容

最新更新