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

在Dart/Flutter中对含列表的Map按paymentDueDate排序

Dart按paymentDueDate对Map中的payments列表排序

问题场景

从JSON响应中获取到如下Map数据:

map = {
  "status": "Success",
  "payments": [
    {
      "id": 99,
      "groupID": 19,
      "paymentDueDate": "2023-05-12",
      "paymentDate": null,
      "userID": 13,
      "amount": 500,
      "forDuration": "May",
      "proofOfPayment": null,
      "paymentMode": null,
      "paymentID": null,
      "paymentToken": null,
      "approvedBy": null,
      "approvedAt": null,
      "status": "pending",
      "note": "",
      "created_at": "2023-05-09T03:39:01.000000Z",
      "updated_at": "2023-05-09T03:39:01.000000Z"
    }
  ]
};

需要对payments列表按paymentDueDate字段排序,但尝试的代码无法正常工作:

map["payments"].sort(
  (a, b) => (
    a[DateTime.tryParse('paymentDueDate')].compareTo(
      b[DateTime.tryParse('paymentDueDate')],
    ),
  ),
);

错误原因

  1. DateTime解析参数错误:你把字段名"paymentDueDate"直接传给DateTime.tryParse,这会导致解析出null(字符串"paymentDueDate"不是合法日期格式),后续调用compareTo会抛出空指针异常。正确逻辑是先取出列表项中的paymentDueDate字符串,再解析成DateTime。
  2. 类型未明确:map["payments"]的类型是dynamic,直接调用sort可能触发类型警告,建议先转换成明确的List<Map<String, dynamic>>类型。
  3. 未处理null情况:如果paymentDueDate存在null值,直接解析后调用compareTo会报错,需要额外处理这类边界情况。

正确解决方案

基础版本(假设paymentDueDate均为非空合法日期)

// 明确类型,避免动态类型警告
List<Map<String, dynamic>> payments = map["payments"] as List<Map<String, dynamic>>;

payments.sort((a, b) {
  // 先取出日期字符串,再解析为DateTime
  DateTime dateA = DateTime.parse(a["paymentDueDate"]);
  DateTime dateB = DateTime.parse(b["paymentDueDate"]);
  return dateA.compareTo(dateB);
});

// 将排序后的列表放回原map
map["payments"] = payments;

健壮版本(处理paymentDueDate为null或非法格式的情况)

如果存在paymentDueDate为null或格式不合法的情况,可以将这类项统一排在列表末尾:

List<Map<String, dynamic>> payments = map["payments"] as List<Map<String, dynamic>>;

payments.sort((a, b) {
  DateTime? dateA = DateTime.tryParse(a["paymentDueDate"] ?? "");
  DateTime? dateB = DateTime.tryParse(b["paymentDueDate"] ?? "");
  
  // 处理null/非法日期:将这类项排在最后
  if (dateA == null) return 1;
  if (dateB == null) return -1;
  
  return dateA.compareTo(dateB);
});

map["payments"] = payments;

内容的提问来源于stack exchange,提问作者Mbebwo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:36:13