不使用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
相关产品推荐
相关产品推荐

