#flutter #dart
#flutter #dart
Вопрос:
Я возвращаю List
с моего сервера плоский файл с объектами, которые содержат a createdAt
. Я хочу перебрать этот список и найти самый последний созданный, отсортированный по определенному ключу, kind
например, это данные, которые я получаю:
final list = [
{id: '1a' kind: 'MOOD' createdAt: 2021-12-08 19:22:11.000Z},
{id: '1b' kind: 'MOOD' createdAt: 2021-12-08 19:15:11.000Z},
{id: '1c' kind: 'PRESSURE' createdAt: 2021-12-08 18:22:11.000Z},
{id: '1d' kind: 'MOOD' createdAt: 2021-12-07 18:22:11.000Z},
{id: '1e' kind: 'WEIGHT' createdAt: 2021-12-07 17:21:11.000Z},
]
Я хочу иметь возможность получать самые последние createdAt
данные по элементу kind
, так что, например, я хочу получить MOOD
самую последнюю запись, это было бы
{id: '1a' kind: 'MOOD' createdAt: 2021-12-08 19:22:11.000Z}
Аналогично, я хочу получить WEIGHT
самую последнюю запись, которая вернет
{id: '1e' kind: 'WEIGHT' createdAt: 2021-12-07 17:21:11.000Z},
Я пробовал использовать firstWhere
, но я не уверен, как найти самую последнюю дату в списке, поэтому я немного заблудился. У меня также есть доступ к коллекции, если там применим метод.
Ответ №1:
Ваши объекты соответствуют следующему типу:
class Obj {
final String id;
final String kind;
final String createdAt;
Obj(this.id, this.kind, this.createdAt);
String toString() {
return 'Obj{id: $id, kind: $kind, createdAt: $createdAt}';
}
}
Итак, вы можете использовать следующий метод для получения самого последнего:
Obj findEarliestByKind(List<Obj> list, String kind) {
final elems = list.where((Obj item) => item.kind == kind).toList();
elems.sort((a, b) => DateTime.parse(b.createdAt).compareTo(DateTime.parse(a.createdAt)));
return elems[0];
}
Некоторые дополнительные примечания:
- Лучше передавать type как Enum
- Это необходимо для обработки исключений синтаксического анализа и пустого списка
Ответ №2:
Попробуйте использовать DateTime.parse для преобразования строки в объект DateTime. Затем вы можете получить миллисекунды из эпохи. Например:
Map<String, dynamic> getElement(List list, String kind) {
list.where((element) => element['kind'] == kind).toList().sort((a, b) {
return DateTime.parse(b['createdAt']!).millisecondsSinceEpoch -
DateTime.parse(a['createdAt']!).millisecondsSinceEpoch;
});
return list.first;
}