Flutter中如何从重复Map对象列表获取唯一对象列表?
在Flutter中移除Map对象列表的重复项
我有如下的Map对象列表:
[ { "name": "Sameera Tennakoon", "userID": "7c770f8d-hju4-4ddd-b5cb-f3d0caba2bb3", "type": "CASHIER" }, { "name": "Sam Perera", "userID": "7c770f8d-f6f4-3eee-b5cb-f3d0caba2bb3", "type": "CASHIER" }, { "name": "Uma Jackson", "userID": "7c770f8d-f6f4-4ddd-5634-f3d0caba2bb3", "type": "CASHIER" }, { "name": "Anu Ima", "userID": "7c770f8d-f6f4-4ddd-lksa-f3d0caba2bb3", "type": "CASHIER" }, { "name": "Sameera Tennakoon", "userID": "7c770f8d-hju4-4ddd-b5cb-f3d0caba2bb3", "type": "CASHIER" } ];
补充说明:使用.toSet()和.toList()方法无法解决此问题。
方法一:通过userID直接去重
你的重复项核心是userID完全一致,所以可以用临时集合记录已出现的userID,遍历筛选未重复项:
void main() { List<Map<String, dynamic>> users = [ {"name": "Sameera Tennakoon", "userID": "7c770f8d-hju4-4ddd-b5cb-f3d0caba2bb3", "type": "CASHIER"}, {"name": "Sam Perera", "userID": "7c770f8d-f6f4-3eee-b5cb-f3d0caba2bb3", "type": "CASHIER"}, {"name": "Uma Jackson", "userID": "7c770f8d-f6f4-4ddd-5634-f3d0caba2bb3", "type": "CASHIER"}, {"name": "Anu Ima", "userID": "7c770f8d-f6f4-4ddd-lksa-f3d0caba2bb3", "type": "CASHIER"}, {"name": "Sameera Tennakoon", "userID": "7c770f8d-hju4-4ddd-b5cb-f3d0caba2bb3", "type": "CASHIER"} ]; Set<String> seenIds = {}; List<Map<String, dynamic>> uniqueUsers = users.where((user) { return seenIds.add(user['userID']); }).toList(); print(uniqueUsers); }
原理:Set的add方法会返回布尔值——元素不存在则添加并返回true,存在则返回false,通过where筛选返回true的元素即可得到去重列表。
方法二:转换为自定义实体类(推荐)
实际开发中更规范的做法是把Map转为自定义类,重写==和hashCode后,就能直接用.toSet().toList()去重:
1. 定义User实体类
class User { final String name; final String userID; final String type; User({required this.name, required this.userID, required this.type}); // 从Map转User对象 factory User.fromMap(Map<String, dynamic> map) { return User( name: map['name'], userID: map['userID'], type: map['type'], ); } // 基于userID判断对象是否相等 @override bool operator ==(Object other) => identical(this, other) || other is User && runtimeType == other.runtimeType && userID == other.userID; @override int get hashCode => userID.hashCode; // 可选:转回Map格式 Map<String, dynamic> toMap() { return { 'name': name, 'userID': userID, 'type': type, }; } }
2. 实现去重
void main() { List<Map<String, dynamic>> userMaps = [/* 原列表数据 */]; // 转换为User对象列表 List<User> users = userMaps.map((map) => User.fromMap(map)).toList(); // 直接去重 List<User> uniqueUsers = users.toSet().toList(); // 可选:转回Map列表 List<Map<String, dynamic>> uniqueUserMaps = uniqueUsers.map((user) => user.toMap()).toList(); }
方法三:使用fold方法去重
用fold一次性完成遍历和去重逻辑:
List<Map<String, dynamic>> uniqueUsers = users.fold([], (acc, current) { if (!acc.any((user) => user['userID'] == current['userID'])) { acc.add(current); } return acc; });
原理:初始化空列表作为累加器,遍历每个元素时检查累加器中是否存在相同userID的元素,不存在则添加。
内容的提问来源于stack exchange,提问作者Sameera Tennakoon
相关产品推荐
相关产品推荐

