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

如何对Dart Record进行深度相等性比较?

Dart 3 Record 深度相等性比较方案

Dart 3 新增的 Record 类型使用==运算符时会逐字段比对,但字段如果是 List、Map 这类引用类型,即便内容完全一致,比较结果也会是false:

final record1 = ([1, 2],);
final record2 = ([1, 2],);
print(record1 == record2);
// 输出 false

要实现 Record 的深度相等性比较,可以用以下两种方式:

1. 手动实现递归比对函数

自己编写工具函数,递归遍历 Record 的每个字段,针对集合类型(List、Map)和嵌套 Record 做深度校验,基础类型直接用==判断:

bool deepEquals(Object? a, Object? b) {
  // 基础相等直接返回true
  if (a == b) return true;

  // 比对List
  if (a is List && b is List) {
    if (a.length != b.length) return false;
    for (int i = 0; i < a.length; i++) {
      if (!deepEquals(a[i], b[i])) return false;
    }
    return true;
  }

  // 比对Map
  if (a is Map && b is Map) {
    if (a.length != b.length) return false;
    for (final key in a.keys) {
      if (!b.containsKey(key) || !deepEquals(a[key], b[key])) return false;
    }
    return true;
  }

  // 比对Record
  if (a is Record && b is Record) {
    final aFields = a.$fields;
    final bFields = b.$fields;
    if (aFields.length != bFields.length) return false;
    for (int i = 0; i < aFields.length; i++) {
      if (!deepEquals(aFields[i], bFields[i])) return false;
    }
    return true;
  }

  // 其他未覆盖类型返回false
  return false;
}

// 使用示例
void main() {
  final record1 = ([1, 2], {'name': 'dart'});
  final record2 = ([1, 2], {'name': 'dart'});
  print(deepEquals(record1, record2)); // 输出 true
}

2. 借助第三方库简化实现

可以使用 Dart 官方维护的collection包中的DeepCollectionEquality工具,配合 Record 的字段遍历实现深度比对:

首先在pubspec.yaml中添加依赖:

dependencies:
  collection: ^1.18.0

然后编写比对函数:

import 'package:collection/collection.dart';

bool deepRecordEquals(Record a, Record b) {
  final equalityChecker = DeepCollectionEquality();
  final aFields = a.$fields;
  final bFields = b.$fields;

  if (aFields.length != bFields.length) return false;
  
  for (int i = 0; i < aFields.length; i++) {
    if (!equalityChecker.equals(aFields[i], bFields[i])) return false;
  }
  return true;
}

// 使用示例
void main() {
  final record1 = ([1, 2, [3]], {'id': 100});
  final record2 = ([1, 2, [3]], {'id': 100});
  print(deepRecordEquals(record1, record2)); // 输出 true
}

注意事项

  • 如果 Record 中包含自定义类,需要确保该类正确实现了==运算符和hashCode方法,否则深度比对会失效;
  • 递归比对要注意循环引用的场景,可能会导致栈溢出,必要时需添加循环引用检测逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 23:02:28