Сортировать массив объектов JSON по алфавиту вместе с логическим значением свойства в dart. - PullRequest
0 голосов
/ 14 июля 2020

У меня есть массив таких объектов

[
   {
      "contact_id":"ee76f661-91ff-5e6b-b900-79612065a840",
      "contact_name":"Bcd",
      "favorite":false,
   },
   {
      "contact_id":"da34621a-1355-5b6b-8ef5-e3bb60b2c28c",
      "contact_name":"Def",
      "favorite":true,
   },
   {
      "contact_id":"0900bd96-319b-577b-8d01-975347667108",
      "contact_name":"Abcd",
      "favorite":false,
   },
   {
      "contact_id":"0900bd96-319b-577b-8d01-975347667108",
      "contact_name":"Abcde",
      "favorite":true,
   }
]

Я хочу отсортировать объекты в алфавитном порядке в соответствии с contact_name, и те, у которых favorite как истина, также должны появиться в начале. Итак, в этом случае отсортированный массив должен выглядеть следующим образом:

[
   {
      "contact_id":"0900bd96-319b-577b-8d01-975347667108",
      "contact_name":"Abcde",
      "favorite":true,
   },
   {
      "contact_id":"da34621a-1355-5b6b-8ef5-e3bb60b2c28c",
      "contact_name":"Def",
      "favorite":true,
   },
   {
      "contact_id":"0900bd96-319b-577b-8d01-975347667108",
      "contact_name":"Abcd",
      "favorite":false,
   },
   {
      "contact_id":"ee76f661-91ff-5e6b-b900-79612065a840",
      "contact_name":"Bcd",
      "favorite":false,
   },
]

Прямо сейчас это код, который я использую для сортировки, который не дает мне требуемого результата, поскольку я думаю, что это метод неправильный

sortContacts(contacts) {
  contacts.sort((a, b) {
    return a['contact_name']
        .toString()
        .toLowerCase()
        .compareTo(b['contact_name'].toString().toLowerCase());
  });
  contacts.sort((a, b) {
    bool favorite1 = a['favorite'];
    bool favorite2 = b['favorite'];
    return (favorite1 == favorite2) ? 0 : favorite1 ? -1 : 1;
  });
  return contacts;
}

Я как бы застрял на этом, любая помощь будет отличной! Спасибо за уделенное время!

1 Ответ

1 голос
/ 14 июля 2020

Что-то вроде этого должно сработать:

void main() {
  final contacts = [
    {
      "contact_id": "ee76f661-91ff-5e6b-b900-79612065a840",
      "contact_name": "Bcd",
      "favorite": false,
    },
    {
      "contact_id": "da34621a-1355-5b6b-8ef5-e3bb60b2c28c",
      "contact_name": "Def",
      "favorite": true,
    },
    {
      "contact_id": "0900bd96-319b-577b-8d01-975347667108",
      "contact_name": "Abcd",
      "favorite": false,
    },
    {
      "contact_id": "0900bd96-319b-577b-8d01-975347667108",
      "contact_name": "Abcde",
      "favorite": true,
    }
  ];

  contacts.sort((a, b) {
    final aFav = a['favorite'] as bool;
    final bFav = b['favorite'] as bool;

    if (aFav == bFav) {
      final aName = a['contact_name'] as String;
      final bName = b['contact_name'] as String;

      return aName.compareTo(bName);
    } else {
      return aFav ? -1 : 1;
    }
  });

  contacts.forEach(print);
  // {contact_id: 0900bd96-319b-577b-8d01-975347667108, contact_name: Abcde, favorite: true}
  // {contact_id: da34621a-1355-5b6b-8ef5-e3bb60b2c28c, contact_name: Def, favorite: true}
  // {contact_id: 0900bd96-319b-577b-8d01-975347667108, contact_name: Abcd, favorite: false}
  // {contact_id: ee76f661-91ff-5e6b-b900-79612065a840, contact_name: Bcd, favorite: false}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...