您可以使用Set 代替List。如果您使用LinkedHashSet,您可以定义应该被视为相等元素的内容。
然后我们可以将所有元素添加到这个新的LinkedHashSet,这将自动确保以这样一种方式添加元素,如果我们的Set 尚未包含@987654330,我们只会添加Map @ 具有相同的 name 值。
import 'dart:collection';
void main() {
final example = [
{"name": "Store1", "products": <Object>[]},
{"name": "Store2", "products": <Object>[]},
{"name": "Store2", "products": <Object>[]},
{"name": "Store3", "products": <Object>[]},
{"name": "Store4", "products": <Object>[]},
{"name": "Store4", "products": <Object>[]}
];
final organizedCart = (LinkedHashSet<Map<String, Object>>(
equals: (a, b) => a['name'] == b['name'],
hashCode: (o) => o['name'].hashCode)
..addAll(example))
.toList();
print(organizedCart);
// [{name: Store1, products: []}, {name: Store2, products: []},
// {name: Store3, products: []}, {name: Store4, products: []}]
}
我应该注意,您应该正确地停止使用 Map 作为对象,而是实际定义一个名为例如的类。 Store 具有字段 name 和 products。通过这样做,我们可以在此处添加比较逻辑,并使解决方案更加类型安全。
我知道 JavaScript 开发人员真的很喜欢在任何事情上都使用 Map,但这确实是一种糟糕的行为;)
更新:
这是一个使用 Store 类的示例,但我们使用与 Set 相同的技巧:
class Store {
final String name;
final List<Object> products;
Store({required this.name, required this.products});
@override
bool operator ==(Object other) => other is Store && other.name == name;
@override
int get hashCode => name.hashCode;
@override
String toString() => '$name have these products: $products';
}
void main() {
final example = [
Store(name: 'Store1', products: []),
Store(name: 'Store2', products: []),
Store(name: 'Store2', products: []),
Store(name: 'Store3', products: []),
Store(name: 'Store4', products: []),
Store(name: 'Store4', products: []),
];
final organizedCart = {...example}.toList();
print(organizedCart);
// [Store1 have these products: [], Store2 have these products: [],
// Store3 have these products: [], Store4 have these products: []]
}
由于我们的Store 实现了自己的== 和hashCode,我们可以只使用do {...example} 来创建一个新的Set,我们在其中添加来自example 的所有Store 对象。