Flutter如何根据数组元素的name字段值去除重复元素
Flutter 数组按name字段去重实现方案
核心实现逻辑
通过标记已出现的name值,仅保留相同name对应的首个元素,以下提供两种可直接使用的实现方式:
方法1:辅助Set标记法(时间复杂度O(n),性能最优)
// 原始数组定义 List<Map<String, dynamic>> originalList = [ {'name':'Rameez', 'data': [{'age': 1, 'number': 2}]}, {'name':'XYZ', 'data': [{'age': 1, 'number': 2}]}, {'name':'Rameez', 'data': [{'age': 1, 'number': 2}]} ]; // 去重处理 Set<String> existedNames = {}; List<Map<String, dynamic>> uniqueList = originalList.where((element) { final name = element['name'] as String; if (existedNames.contains(name)) return false; existedNames.add(name); return true; }).toList();
执行后uniqueList即为预期的去重结果。
方法2:封装通用扩展方法(适合多场景复用)
如果项目中经常需要按不同字段去重,可封装为Dart扩展方法,降低重复代码:
// 定义通用数组去重扩展 extension ListUniqueExtension<T> on List<T> { List<T> uniqueBy<K>(K Function(T element) getKey) { final Set<K> existedKeys = {}; return where((element) { final key = getKey(element); if (existedKeys.contains(key)) return false; existedKeys.add(key); return true; }).toList(); } } // 调用示例,按name字段去重 final uniqueList = originalList.uniqueBy((item) => item['name'] as String);
补充说明
- 如果业务场景中
name字段可能为空,可调整Set类型为Set<String?>,增加空安全判断即可兼容空值去重 - 如果需要保留重复name的最后一条记录而非第一条,可先将原数组倒序遍历再处理,最后反转结果即可
内容的提问来源于stack exchange,提问作者rameez khan
相关产品推荐
相关产品推荐

