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

Flutter中如何去除自定义对象列表中相同姓名手机号的重复项

联系人列表去重实现方案

判断两个联系人对象是否为重复项的核心标准为:displayName(姓名)与phoneNumbers(手机号)两个字段的值完全相等,任意一个字段不同就不属于重复项,针对不同使用场景可以选择以下实现方式:

场景1:现有含重复项的列表做一次性去重

可以用临时集合存储已经出现过的姓名+手机号组合,遍历原列表筛选出不重复的对象即可,Dart示例代码如下:

// 存储已经出现过的唯一标识组合
Set<String> uniqueKeys = {};
List<myContactsModel> filteredContacts = originalContacts.where((contact) {
  String key = '${contact.displayName}_${contact.phoneNumbers}';
  if (uniqueKeys.contains(key)) {
    return false;
  }
  uniqueKeys.add(key);
  return true;
}).toList();

执行完后filteredContacts就是已经去重完成的无重复列表。

场景2:新增联系人时实时校验避免重复

每次往列表添加新联系人之前,先判断列表中是否已经存在相同姓名+手机号的对象,存在就不执行新增操作:

void addContactIfNotExist(List<myContactsModel> contactList, myContactsModel newContact) {
  bool isDuplicate = contactList.any((contact) => 
    contact.displayName == newContact.displayName && 
    contact.phoneNumbers == newContact.phoneNumbers
  );
  if (!isDuplicate) {
    contactList.add(newContact);
  }
}

优化方案:重写类的相等判断逻辑

如果后续需要频繁做重复判断,可以直接在myContactsModel类里重写==运算符和hashCode,把两个字段的相等判断逻辑内置到类本身:

class myContactsModel {
  final String displayName;
  final String phoneNumbers;
  final dynamic avatar;

  myContactsModel({
    required this.displayName,
    required this.phoneNumbers,
    required this.avatar,
  });

  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is myContactsModel &&
          runtimeType == other.runtimeType &&
          displayName == other.displayName &&
          phoneNumbers == other.phoneNumbers;

  @override
  int get hashCode => displayName.hashCode ^ phoneNumbers.hashCode;
}

重写之后直接用contains方法就能判断重复,也可以直接把列表转成Set再转回List实现一键去重:

List<myContactsModel> filteredContacts = originalContacts.toSet().toList();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:54:04