Dart中按出生日期分组后正确计算每组活动总价格的实现方法
Dart中按出生日期分组后正确计算每组活动总价格的实现方法
嗨,我看你已经搞定了按出生日期分组的逻辑,但计算每组活动总价格时踩了个小坑——用全局变量total累加会把所有组的价格混在一起,导致结果不符合预期。别担心,只需要调整一下每组总价的计算方式,让每个分组单独统计自己的价格总和就可以解决啦!
问题分析
你原来的代码里用了全局的double total = 0;,然后在map里执行total+=l.first["PriceOfEvent"],这会让total一直累加所有组的价格,而不是每个分组单独计算。比如第一组的总价本该是35000+20000=55000,但第二组的总价会变成55000+22000=77000,这显然不是你想要的结果。
修正后的完整代码
我们可以直接对每个分组的列表使用fold方法,单独计算该组的PriceOfEvent总和,完全不需要全局变量:
import 'dart:convert'; void main() { final data = [ { "FullName": "Harry Potter", "DateOfBirth": "2020/02/16", "Department": "Branch Operation", "BirthDay": "Friday", "PriceOfEvent": 35000, }, { "FullName": "John Wick", "DateOfBirth": "2020/02/16", "Department": "Finance", "BirthDay": "Friday", "PriceOfEvent": 20000, }, { "FullName": "Solomon Kane", "DateOfBirth": "2020/02/19", "Department": "Loan", "BirthDay": "Monday", "PriceOfEvent": 22000, } ]; final value = data.fold(<String, List<dynamic>>{}, (Map<String, List<dynamic>> a, b) { a.putIfAbsent(b['DateOfBirth'].toString(), () => []).add(b); return a; }).values .where((l) => l.isNotEmpty) .map((l) => { 'DateOfBirth': l.first['DateOfBirth'], 'BirthDay': l.first['BirthDay'], // 核心修改:对当前分组的所有item单独累加价格 "TotalEventPrice": l.fold(0, (sum, item) => sum + item["PriceOfEvent"]), 'Data': l.map((e) => { 'Department': e['Department'], 'FullName': e['FullName'], }).toList() }).toList(); print(json.encode(value)); }
关键修改说明
- 移除了全局的
double total = 0;变量,彻底避免跨分组的错误累加 - 在每个分组的
map转换中,用l.fold(0, (sum, item) => sum + item["PriceOfEvent"])计算当前组的总价:fold的初始值设为0,代表总和的起点- 每次迭代把当前item的
PriceOfEvent加到sum上,最终得到该组的独立总价
运行结果验证
执行这段代码后,输出的JSON完全符合你的预期:
[ { "DateOfBirth": "2020/02/16", "BirthDay": "Friday", "TotalEventPrice": 55000, "Data": [ { "Department": "Branch Operation", "FullName": "Harry Potter" }, { "Department": "Finance", "FullName": "John Wick" } ] }, { "DateOfBirth": "2020/02/19", "BirthDay": "Monday", "TotalEventPrice": 22000, "Data": [ { "Department": "Loan", "FullName": "Solomon Kane" } ] } ]
这样就完美实现了按出生日期分组,同时正确计算每组活动总价格的需求啦!
备注:内容来源于stack exchange,提问作者Deepak
相关产品推荐
相关产品推荐

