Как мне получить последний / самый последний элемент в списке с датой и временем с определенным ключом?

#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];
}
 

Некоторые дополнительные примечания:

  1. Лучше передавать type как Enum
  2. Это необходимо для обработки исключений синтаксического анализа и пустого списка

Ответ №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;
}