我有 2 个动态列表和 2 个地图
2 列表
List<dynamic> superDeepList1 = [
[
{
'name': 'Alice',
'age': 30,
'height': 5.8,
'isStudent': false,
'friends': ['Bob', 'Carol', 'David'],
'address': {
'street': '123 Main St',
'city': 'Wonderland',
'zipcode': '12345'
}
},
{
'name': 'Bob',
'age': 25,
'height': 6.1,
'isStudent': true,
'friends': ['Alice', 'Carol'],
'address': {
'street': '456 Elm St',
'city': 'Dreamville',
'zipcode': '54321'
}
},
'This is a string item'
],
[
{
'name': 'Carol',
'age': 28,
'height': 5.5,
'isStudent': true,
'friends': ['Alice', 'Bob', 'David'],
'address': {
'street': '789 Oak St',
'city': 'Fantasia',
'zipcode': '67890'
}
},
{
'name': 'David',
'age': 32,
'height': 5.9,
'isStudent': false,
'friends': ['Alice', 'Carol'],
'address': {
'street': '321 Pine St',
'city': 'Neverland',
'zipcode': '09876'
}
},
'Another string item'
]
];
List<dynamic> superDeepList2 = [
[
{
'name': 'Alfdsfe',
'age': 36,
'height': 5.8,
'isStudent': false,
'friends': ['Bob', 'Carol', 'David'],
'address': {
'street': '123 Main St',
'city': 'Wonderland',
'zipcode': '12345'
}
},
{
'name': 'Bob',
'age': 25,
'height': 6.1,
'isStudent': true,
'friends': ['Alice', 'Carol'],
'address': {
'street': '456 Elm St',
'city': 'Dreamville',
'zipcode': '54321'
}
},
'This is a string item'
],
[
{
'name': 'Carol',
'age': 28,
'height': 5.5,
'isStudent': true,
'friends': ['Alice', 'Bob', 'David'],
'address': {
'street': '789 Oak St',
'city': 'Fantasia',
'zipcode': '67890'
}
},
{
'name': 'David',
'age': 32,
'height': 5.9,
'isStudent': false,
'friends': ['Alice', 'Carol'],
'address': {
'street': '321 Pine St',
'city': 'Neverland',
'zipcode': '09876'
}
},
'Another string item'
]
];
2 地图
Map<String, dynamic> superDeepMap1 = {
'outerKey1': {
'innerKey1': {
'nestedKey1': 'value1',
'nestedKey2': 'value2',
'nestedKey3': {
'deepNestedKey1': 'deepValue1',
'deepNestedKey2': 'deepValue2'
}
},
'innerKey2': {
'nestedKey4': 'value4',
'nestedKey5': 'value5'
}
},
'outerKey2': {
'innerKey3': {
'nestedKey6': 'value6',
'nestedKey7': 'value7'
},
'innerKey4': {
'nestedKey8': 'value8',
'nestedKey9': 'value9'
}
}
};
Map<String, dynamic> superDeepMap2 = {
'outerKey1': {
'innerKey1': {
'nestedKey1': 'value1',
'nestedKey2': 'value2',
'nestedKey3': {
'deepNestedKey1': 'deepValue1',
'deepNestedKey2': 'deepValue2'
}
},
'innerKey2': {
'nestedKey4': 'value4',
'nestedKey5': 'value5'
}
},
'outerKey2': {
'innerKey3': {
'nestedKey6': 'value6',
'nestedKey7': 'value7'
},
'innerKey4': {
'nestedKey8': 'value8',
'nestedKey9': 'value9'
}
}
};
如果
superDeepList1
== superDeepList2 的长度和内容完全相同,如何判断。和地图同样的问题。
到目前为止我发现的最好方法是以下
https://pub.dev/packages/collection
bool listsEqual = const DeepCollectionEquality().equals(superDeepList1,superDeepList2);
但是有没有不使用外部包的短代码?
不。平台库中没有类似
DeepCollectionEquality
的内容。
这就是为什么它位于 package:collection
中,它的目的是具有 dart:collection
中没有的功能,并且不需要 位于平台库中。
您可以编写自己的代码。如果您假设所有映射都是标准的基于相等的哈希映射,那么这是最简单的。如果地图使用不同的平等概念,那么比较它们......很棘手。所以不要这样做。这是简单的代码:
bool equals(Object? v1, Object? v2) {
if (identical(v1, v2) || v1 == v2) return true;
if (v1 is Map) return v2 is Map && mapsEqual(v1, v2);
if (v1 is List) return v2 is List && listEqual(v1, v2);
if (v1 is Set) return v2 is Set && setEqual(v1, v2);
if (v1 is double) {
return v1.isNaN && v2 is double && v2.isNaN;
}
return false;
}
bool mapsEqual(Map map1, Map map2) {
if (map1.length != map2.length) return false;
for (var key in map1.keys) {
var value1 = map1[key];
var value2 = map2[key];
if (value1 == null && (value2 != null || !map2.containsKey(key))) {
return false;
}
if (!equals(value1, value2)) return false;
}
return true;
}
bool setEqual(Set v1, Set v2) {
if (v1.length != v2.length) return false;
for (var v in v1) {
if (!v2.contains(v)) return false;
}
return true;
}
bool listEqual(List v1, List v2) {
if (v1.length != v2.length) return false;
for (var i = 0; i < v1.length; i++) {
if (!equals(v1[i], v2[i])) return false;
}
return true;
}