0

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":"tintu@gmail.com"
    },
    {
      "userEmail":"john@gmail.com"
    },
    {
      "userEmail":"tintu@gmail.com"
    },
    {
      "userEmail":"rose@gmail.com"
    },
    {
      "userEmail":"john@gmail.com"
    },
  ];

Expected Output

List users = [
    {
      "userEmail":"tintu@gmail.com"
    },
    {
      "userEmail":"john@gmail.com"
    },
    {
      "userEmail":"rose@gmail.com"
    },
  ];

Muk System
  • 15
  • 2

2 Answers2

2

Let's try, here you get the unique list

void main() {
  var users = [
    {"userEmail": "tintu@gmail.com"},
    {"userEmail": "john@gmail.com"},
    {"userEmail": "tintu@gmail.com"},
    {"userEmail": "rose@gmail.com"},
    {"userEmail": "john@gmail.com"},
  ];
  var uniqueList = users.map((o) => o["userEmail"]).toSet();
  print(uniqueList.toList());
}
Jahidul Islam
  • 11,435
  • 3
  • 17
  • 38
2

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": "tintu@gmail.com"},
    {"userEmail": "john@gmail.com"},
    {"userEmail": "tintu@gmail.com"},
    {"userEmail": "rose@gmail.com"},
    {"userEmail": "john@gmail.com"},
  ];

  var finalList = [
    ...LinkedHashSet<Map<String, String>>(
      equals: (user1, user2) => user1['userEmail'] == user2['userEmail'],
      hashCode: (user) => user['userEmail'].hashCode,
    )..addAll(users)
  ];
  finalList.forEach(print);
}
jamesdlin
  • 81,374
  • 13
  • 159
  • 204