List<Map> todos = [
        {"todo": "Walk The dog", "isDone": false},
        {"todo": "Complete Assignment", "isDone": true},
        {"todo": "Buy Groceries", "isDone": true},
        {"todo": "Gym", "isDone": false},
        {"todo": "Netflix", "isDone": false},
      ];

Quiero ordenar la lista según el valor de "isDone". si isDone = true, el mapa en ese índice debe moverse al final de la lista.

0
Mobashshir Iqbal 23 ene. 2021 a las 09:36

1 respuesta

La mejor respuesta

Probado en dardos ...

void main() {
  List<Map> todos = [
    {"todo": "Walk The dog", "isDone": false},
    {"todo": "Complete Assignment", "isDone": true},
    {"todo": "Buy Groceries", "isDone": true},
    {"todo": "Gym", "isDone": false},
    {"todo": "Netflix", "isDone": false},
  ];
  todos.sort((a, b) => (a['isDone'] ? 1 : 0).compareTo(b['isDone'] ? 1 : 0));
  for (var v in todos.map((e) => [e['todo'], e['isDone']])) {
    print(v);
  }
}

No se ocupa de valores faltantes o nulos.

Actualización: función de mapeo refactorizada fuera de la comparación para garantizar la coherencia:

void main() {
  List<Map> todos = [
    {"todo": "Walk The dog", "isDone": false},
    {"todo": "Complete Assignment", "isDone": true},
    {"todo": "Buy Groceries", "isDone": true},
    {"todo": "Gym", "isDone": false},
    {"todo": "Netflix", "isDone": false},
  ];
  int e2v (Map e) => e['isDone'] ? 1 : 0;   // map false to 0, true to 1
  todos.sort((a, b) => (e2v(a).compareTo(e2v(b))));
  for (var v in todos.map((e) => [e['todo'], e['isDone']])) {
    print(v);
  }
}

Idea: sort debería tener un primo para el que la interfaz podría verse como

todos.sortBy((e) => e['isDone'] ? 1 : 0);

Y mira, dos horas después, veré cómo hacerlo con los dispositivos integrados. :)

Editar: OK, 45 minutos y tengo esto, pero faltan los genéricos:

void main() {
  List<Map> todos = [
    {"todo": "Walk The dog", "isDone": false},
    {"todo": "Complete Assignment", "isDone": true},
    {"todo": "Buy Groceries", "isDone": true},
    {"todo": "Gym", "isDone": false},
    {"todo": "Netflix", "isDone": false},
  ];
  todos.sortBy((e) => e['isDone'] ? 1 : 0);
  for (var v in todos.map((e) => [e['todo'], e['isDone']])) {
    print(v);
  }
}

extension ListSortBy on List {
  void sortBy(mapper(e)) {
    this.sort((a, b) => mapper(a).compareTo(mapper(b)));
  }
}
2
Randal Schwartz 23 ene. 2021 a las 19:36