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

不使用groupBy插件如何通过Dart原生方法实现列表对象按字段分组

Dart原生实现列表按指定字段分组(无需第三方插件)

核心实现思路

通过Dart原生Map做临时缓存,单次遍历原始列表完成分组,时间复杂度为O(n),无第三方插件依赖,性能远高于collection包封装的groupBy方法。

完整实现代码

List<Map<String, dynamic>> groupListByDate(List<dynamic> originalData) {
  // 临时存储分组,key为date字段值,value为对应分组的元素列表
  final Map<String, List<dynamic>> tempGroup = {};

  // 遍历一次原始数据完成分组
  for (final item in originalData) {
    final date = item['date'] as String;
    // 不存在该分组时先初始化
    if (!tempGroup.containsKey(date)) {
      tempGroup[date] = [];
    }
    tempGroup[date]!.add(item);
  }

  // 将Map结构转换为目标输出格式
  return tempGroup.entries.map((entry) {
    return {
      "date": entry.key,
      "message": entry.value,
    };
  }).toList();
}

使用示例

void main() {
  List<dynamic> data = [
    {"title": "msg1", "message": "hi all", "date": "1969-07-20 20:18:04Z"},
    {"title": "msg2", "message": "hi all", "date": "1969-07-20 20:18:04Z"},
    {"title": "msg2", "message": "hi all", "date": "1969-07-21 20:18:04Z"},
    {"title": "msg2", "message": "hi all", "date": "1969-07-21 20:18:04Z"},
    {"title": "msg2", "message": "hi all", "date": "1969-07-22 20:18:04Z"},
    {"title": "msg2", "message": "hi all", "date": "1969-07-22 20:18:04Z"}
  ];

  final result = groupListByDate(data);
  // 输出结果与要求的目标JSON结构完全一致
}

可选优化(按日期排序)

Dart默认Map为LinkedHashMap,会保留key的插入顺序,和原始列表中date出现的顺序一致。如果需要按日期升/降序排列,可修改转换逻辑:

// 按日期升序排列的实现
return tempGroup.entries
    .toList()
    ..sort((a, b) => a.key.compareTo(b.key)) // 降序将a、b互换位置即可
    .map((entry) => {
          "date": entry.key,
          "message": entry.value,
        })
    .toList();

性能说明

  • 仅需遍历原始列表1次,Map查找、插入操作均为O(1)时间复杂度,整体为线性时间复杂度
  • 无第三方库的额外封装开销,数据量越大,性能优势越明显

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:39:02