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

如何移除Map列表中place值重复的对象

问题描述

我有一个包含name和place键的Map列表,需求为:若两个Map的place值相同,则移除后出现的那个Map。以如下示例列表为例,第二个place为Japan的Map需要被移除。

示例列表代码:

List exampleList = [
    {
      'name': 'Akashi',
      'place': 'Japan',
    },
    {
      'name': 'Genta',
      'place': 'Japan',
    },
    {
      'name': 'Hinata',
      'place': 'indonesia',
    },
    {
      'name': 'Jinwoo',
      'place': 'Korea',
    },
  ];
解决方案

方案1:遍历+集合记录已出现的place

通过遍历列表,用集合记录已经处理过的place值,只保留每个place第一次出现的Map,性能更优:

void main() {
  List exampleList = [
    {'name': 'Akashi', 'place': 'Japan'},
    {'name': 'Genta', 'place': 'Japan'},
    {'name': 'Hinata', 'place': 'indonesia'},
    {'name': 'Jinwoo', 'place': 'Korea'},
  ];

  Set<String> seenPlaces = {};
  List filteredList = [];

  for (var map in exampleList) {
    String place = map['place'] as String;
    if (!seenPlaces.contains(place)) {
      seenPlaces.add(place);
      filteredList.add(map);
    }
  }

  print(filteredList);
  // 输出结果: [{'name': 'Akashi', 'place': 'Japan'}, {'name': 'Hinata', 'place': 'indonesia'}, {'name': 'Jinwoo', 'place': 'Korea'}]
}

方案2:使用fold方法简化代码

利用Dart的fold方法,在一次遍历中完成过滤,代码更简洁:

void main() {
  List exampleList = [
    {'name': 'Akashi', 'place': 'Japan'},
    {'name': 'Genta', 'place': 'Japan'},
    {'name': 'Hinata', 'place': 'indonesia'},
    {'name': 'Jinwoo', 'place': 'Korea'},
  ];

  final filteredList = exampleList.fold<List>([], (acc, map) {
    final place = map['place'] as String;
    if (!acc.any((item) => item['place'] == place)) {
      acc.add(map);
    }
    return acc;
  });

  print(filteredList);
}

说明

  • 两种方案都会保留每个place第一次出现的Map,自动移除后续重复条目
  • 方案1的效率更高:集合判断元素存在的时间复杂度为O(1),而方案2中any方法的时间复杂度为O(n),数据量较大时方案1更适合

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:01:07