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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:27:55