Dart如何基于指定日期列表补全折线图缺失的0值GraphData数据列表
问题原因
你的代码有两个核心错误导致无法运行和得到预期结果:
- 构造
GraphData实例做匹配时,仅传入了xAxis一个参数,不符合你定义的双参数构造函数要求,直接触发编译错误 - Dart默认的对象相等判断是对比内存地址,未重写
==运算符和hashCode的前提下,就算两个GraphData的xAxis值完全一致,List.contains()也会判定为不相等
修复方案
推荐先把现有销售数据转换为「时间戳-销售收入」的映射表,再遍历要求的13个周日期直接取值,不存在就补0,逻辑更简单,查找效率也更高:
void main() { // 实际输入的周度销售数据 List<GraphData> mockupGraphData = [ GraphData(1586761200000, 145333), GraphData(1587366000000, 433343), GraphData(1587970800000, 223432), GraphData(1589180400000, 122221), GraphData(1589785200000, 982347), GraphData(1590994800000, 234322), ]; int entries = 13; int latestDateReported = DateTime(2020, 6, 1).millisecondsSinceEpoch; int oneWeek = Duration(days: 7).inMilliseconds; int earliestEntryDate = latestDateReported - (oneWeek * entries); List<int> graphRequiredDates = []; List<GraphData> finalData = []; for (int i = 0; i < entries; i++) { earliestEntryDate += oneWeek; graphRequiredDates.add(earliestEntryDate); } // 转换现有数据为时间戳到收入的映射表,方便快速查找 Map<int, int> saleMap = { for (var data in mockupGraphData) data.xAxis: data.yAxis }; // 遍历要求的13个日期,直接生成最终数据 for (var date in graphRequiredDates) { finalData.add(GraphData(date, saleMap[date] ?? 0)); } print(finalData); } class GraphData { int xAxis; // 销售日期 int yAxis; // 销售收入 GraphData(this.xAxis, this.yAxis); @override String toString() { return '$xAxis $yAxis'; } }
运行后输出结果和你要求的理想输出完全一致。
内容的提问来源于stack exchange,提问作者RobbB
相关产品推荐
相关产品推荐

