user3379856
user3379856

Reputation: 261

Sort a list of maps in Dart - Second Level Sort in Dart

I have a list of maps like this:

var associations = [{'name': 'EG', 'description': 'Evil Genius'},
                    {'name': 'NaVi', 'description': 'Natus Vincere'}];

var members = [
{'associationName': 'EG', 'firstName': 'Bob', 'lastName': 'Dylan', 'email': '[email protected]'},
{'associationName': 'NaVi', 'firstName': 'John', 'lastName': 'Malkovich', 'email': '[email protected]'},
{'associationName': 'EG', 'firstName': 'Charles', 'lastName': 'Darwin', 'email': '[email protected]'}
];

I would like to write a code that would sort the list of members alphabetically by the last name first, then by the first name. Moreover, I would like to be able to find members whose lastnames start with a specifiedd letter. By example, with D, we would get Bob Dylan and Charles Darwin. I am able to manage it with a single map or a single list, but combining a list of maps makes it more difficult.

Thanks for your help.

Upvotes: 26

Views: 15823

Answers (3)

Karan Gore
Karan Gore

Reputation: 21

 final data = [
  EmployerModel(id: "1", image: "", name: "A"),
  EmployerModel(id: "1", image: "", name: "A"),
  EmployerModel(id: "1", image: "", name: "B"),
  EmployerModel(id: "1", image: "", name: "B"),
  EmployerModel(id: "1", image: "", name: "C"),
  EmployerModel(id: "1", image: "", name: "E"),
  EmployerModel(id: "1", image: "", name: "E"),
  EmployerModel(id: "1", image: "", name: "E"),
  EmployerModel(id: "1", image: "", name: "G"),
];
var firstAlph = data[0].name![0];
List<Map<String, dynamic>> d = [];
data.forEach((element) {
  if (element.name![0] == firstAlph) {
    if (d.isEmpty) {
      d.add({
        firstAlph: [element],
      });
    } else {
      d.forEach((e) {
        if (e.keys.contains(firstAlph)) {
          e[firstAlph].add(element);
        }
      });
    }
  } else {
    firstAlph = element.name![0];
    d.add({
      firstAlph: [element],
    });
  }
});
debugPrint(d.toString());

This will give a List in alphabetical order which will make you're UI look much better. Output example:

["A":[data,data,data],"B":[data,data,data]]

Upvotes: 1

ifredom
ifredom

Reputation: 1090

List<Map> myList = [
  { 'name' : 'ifredom','age':23},
  { 'name' : 'JackMa','age':61},
  { 'name' : 'zhazhahui','age':48},
];

myList.sort((a, b) => (b['age']).compareTo(a['age'])); /// sort List<Map<String,dynamic>>

print(myList);

Upvotes: 20

Alexandre Ardhuin
Alexandre Ardhuin

Reputation: 76273

To sort :

members.sort((m1, m2) {
  var r = m1["lastName"].compareTo(m2["lastName"]);
  if (r != 0) return r;
  return m1["firstName"].compareTo(m2["firstName"]);
});

To filter :

members.where((m) => m['lastName'].startsWith('D'));

Upvotes: 45

Related Questions