Список групп Flutter / Dart по дате - PullRequest
1 голос
/ 28 мая 2020

У меня есть следующий список карт:

[
   {
      "FullName":"Harry Potter",
      "DateOfBirth": "2020/02/16",
      "Department":"Branch Operation",
      "BirthDay":"Friday"
   },
   {
      "FullName":"John Wick",
      "DateOfBirth": "2020/02/16",
      "Department":"Finance",
      "BirthDay":"Friday"
   },
   {
      "FullName":"Solomon Kane",
      "DateOfBirth":2020/02/19,
      "Department":"Loan",
      "BirthDay":"Monday"
   }
]

Я хотел бы манипулировать данными, указанными выше, чтобы данные были сгруппированы по их DateOfBirth, чтобы результат выглядел так. *

В Javascript этого можно достичь, используя функцию reduce, а затем используя сопоставление клавиш объекта. Я также знаю, что у dart есть полезный пакет под названием collection

Поскольку я новичок в дротике и флаттере, я не знаю, как это сделать. Кто-нибудь может мне в этом помочь?

Спасибо

1 Ответ

1 голос
/ 28 мая 2020

Вы можете использовать fold и сделать что-то вроде этого

const data = [...];

void main() {
 final value = data.fold(Map<String, List<dynamic>>(), (Map<String, List<dynamic>> a, b) {
   a.putIfAbsent(b['DateOfBirth'], () => []).add(b);
   return a;
 }).values
   .where((l) => l.isNotEmpty)
   .map((l) => {
     'DateOfBirth': l.first['DateOfBirth'],
     'BirthDay': l.first['BirthDay'],
     'Data': l.map((e) => {
       'Department': e['Department'],
       'FullName': e['FullName'],
     }).toList()
 }).toList();
}

Или вот так, если вы хотите использовать оператор распространения, я не знаю, насколько он удобочитаем.

 final result = data.fold({}, (a, b) => {
     ...a,
     b['DateOfBirth']: [b, ...?a[b['DateOfBirth']]],
 }).values
   .where((l) => l.isNotEmpty)
   .map((l) => {
     'DateOfBirth': l.first['DateOfBirth'],
     'BirthDay': l.first['BirthDay'],
     'Data': l.map((e) => {
       'Department': e['Department'],
       'FullName': e['FullName'],
     }).toList()
 }).toList();
...