Flutter中按最近到期日期去除JSON产品数据重复项的实现
Flutter 产品JSON去重:保留最晚到期条目
问题分析
你需要处理包含产品名称和到期日期的JSON数据,目标是去除重复产品条目,仅保留每个产品中到期日期最晚的记录。原代码的forEach逻辑错误,每次循环直接覆盖结果列表,无法实现去重需求。
解决方案思路
核心是通过Map分组+日期对比实现:
- 用产品名称作为Map的键,确保每个名称唯一
- 遍历所有产品,对比同一名称下的到期日期,保留最晚的条目
- 最后将Map的值转为List,得到最终结果
完整实现代码
1. 适配JSON的ProductModels实体类
如果还没定义实体类,可参考以下代码(使用json_serializable生成序列化代码):
import 'package:json_annotation/json_annotation.dart'; import 'dart:convert'; part 'product_models.g.dart'; @JsonSerializable() class ProductModels { @JsonKey(name: 'NAME') String name; @JsonKey(name: 'EXPIRYDATE') String expiryDate; ProductModels({required this.name, required this.expiryDate}); factory ProductModels.fromJson(Map<String, dynamic> json) => _$ProductModelsFromJson(json); Map<String, dynamic> toJson() => _$ProductModelsToJson(this); } // 自动生成的序列化方法(需通过json_serializable工具生成) List<ProductModels> productModelsFromJson(String str) => List<ProductModels>.from(json.decode(str).map((x) => ProductModels.fromJson(x)));
2. 去重处理核心代码
var productos= "[{ \"NAME\": \"STRAWBERRY MILK\", \"EXPIRYDATE\": \"2022-01-01\" }, { \"NAME\": \"COOKIES\", \"EXPIRYDATE\": \"2023-01-28\" }, { \"NAME\": \"STRAWBERRY MILK\", \"EXPIRYDATE\": \"2022-01-11\" }, { \"NAME\": \"STRAWBERRY MILK\", \"EXPIRYDATE\": \"2022-12-11\" }]"; List<ProductModels> productsJson = productModelsFromJson(productos); List<ProductModels> clearProductsJson = []; // 初始化Map用于按产品名称分组 Map<String, ProductModels> productMap = {}; for (var product in productsJson) { try { // 将字符串日期转为DateTime,方便比较先后 DateTime currentExpiry = DateTime.parse(product.expiryDate); if (productMap.containsKey(product.name)) { // 对比已有条目和当前条目的到期日期 DateTime existingExpiry = DateTime.parse(productMap[product.name]!.expiryDate); if (currentExpiry.isAfter(existingExpiry)) { // 当前条目日期更新,替换Map中的旧条目 productMap[product.name] = product; } } else { // 该产品首次出现,直接加入Map productMap[product.name] = product; } } catch (e) { // 处理日期格式异常,可根据需求调整(比如跳过或记录日志) print('解析日期出错:$e'); } } // 将Map中的值转为List,得到去重后的结果 clearProductsJson = productMap.values.toList(); // 验证结果(转为JSON输出) print(jsonEncode(clearProductsJson));
结果说明
运行上述代码后,clearProductsJson将包含期望输出的结果:
[ {"NAME": "COOKIES", "EXPIRYDATE": "2023-01-28"}, {"NAME": "STRAWBERRY MILK", "EXPIRYDATE": "2022-12-11"} ]
内容的提问来源于stack exchange,提问作者Alicia Morales
相关产品推荐
相关产品推荐

