You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:45:55