I have a set of items. From this i want to delete all duplicate values. i tried this
finalList = [...{...users!}];
and this print(users.toSet().toList());
. But both are printing all the data in the list. It didn't removing duplicate values. Below is my list
List users = [
{
"userEmail":"[email protected]"
},
{
"userEmail":"[email protected]"
},
{
"userEmail":"[email protected]"
},
{
"userEmail":"[email protected]"
},
{
"userEmail":"[email protected]"
},
];
Expected Output
List users = [
{
"userEmail":"[email protected]"
},
{
"userEmail":"[email protected]"
},
{
"userEmail":"[email protected]"
},
];
CodePudding user response:
Let's try, here you get the unique list
void main() {
var users = [
{"userEmail": "[email protected]"},
{"userEmail": "[email protected]"},
{"userEmail": "[email protected]"},
{"userEmail": "[email protected]"},
{"userEmail": "[email protected]"},
];
var uniqueList = users.map((o) => o["userEmail"]).toSet();
print(uniqueList.toList());
}
CodePudding user response:
Your attempts don't work because most objects (including Map
) use the default implementation for the ==
operator, which checks only for object identity. See: How does a set determine that two objects are equal in dart? and How does Dart Set compare items?.
One way to make the List
to Set
to List
approach work is by explicitly specifying how the Set
should compare objects:
import 'dart:collection';
void main() {
var users = [
{"userEmail": "[email protected]"},
{"userEmail": "[email protected]"},
{"userEmail": "[email protected]"},
{"userEmail": "[email protected]"},
{"userEmail": "[email protected]"},
];
var finalList = [
...LinkedHashSet<Map<String, String>>(
equals: (user1, user2) => user1['userEmail'] == user2['userEmail'],
hashCode: (user) => user['userEmail'].hashCode,
)..addAll(users)
];
finalList.forEach(print);
}