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
相关产品推荐
相关产品推荐

