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

Dart中如何判断两个对象相等 简化对象属性比较逻辑

问题原因

Dart 自定义对象默认的==判断是引用相等,只有两个变量指向内存中的同一个实例时,才会判定为相等。List.contains()、List.indexOf()这类方法内部都是基于对象的==逻辑做判断的,所以即使两个Meal对象的所有属性值完全一致,只要是不同的实例,默认判定就是不相等,这就是手动逐属性对比能找到匹配、但contains返回无匹配的核心原因。

优化实现方案

最一劳永逸的方式是给Meal类重写==运算符和对应的hashCode,把相等规则定义为需要的四个属性值匹配,后续所有相等判断场景都不用再手写逐属性对比的逻辑。

第一步:修改Meal类的相等逻辑

class Meal {
  // 保留原有的属性定义、构造函数、其他业务方法
  DateTime data;
  bool especial;
  String local;
  String tipo;

  @override
  bool operator ==(Object other) {
    // 同一内存实例直接返回相等
    if (identical(this, other)) return true;
    // 类型匹配+四个属性全部相等时判定对象相等
    return other is Meal
        && other.data == data
        && other.especial == especial
        && other.local == local
        && other.tipo == tipo;
  }

  // 重写hashCode,必须和==的判断逻辑保持一致
  @override
  int get hashCode => Object.hash(data, especial, local, tipo);
}

第二步:简化重复检测逻辑

重写完成后,contains方法就会自动按照定义的属性匹配规则判断相等,原来的双层嵌套循环可以简化为:

int checkIfMealDuplicated(List<Meal> restrictedBookings, List<Meal> bookings) {
  for (var i = 0; i < restrictedBookings.length; i++) {
    if (bookings.contains(restrictedBookings[i])) {
      return i;
    }
  }
  return -1;
}

如果不想修改原Meal类的默认相等逻辑,也可以把属性判断逻辑抽成一个独立的公共工具函数,避免在多个业务场景重复写相同的if判断,但这种方式不如重写==简洁,后续维护成本更高。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 02:51:58