У меня есть следующий список, который я пытаюсь переупорядочить/сортировать по DateTime.
import 'package:intl/intl.dart';
//don't forget to add under dependencies pubspec.yml "intl: ^0.15.8"
List products = [];
//adding into the new list from raw API list
for(final item in rawProducts){
var parsedDate = DateTime.parse.(item['expiryDate']);
tmpArray = {
'id': item['id'],
'name': item['name'],
'price': item['price'],
'expiry': parsedDate
}
products.add(tmpArray);
}
}
List products = [
{id: 1242, name: milk, price: $5, expiry: 2019-11-25 00:00:00:000},
{id: 1242, name: egg, price: $2, expiry: 2019-11-22 00:00:00:000},
{id: 1243, name: bread, price: $3, expiry: 2019-11-22 00:00:00:000},
{id: 1244, name: butter, price: $7, expiry: 2019-11-24 00:00:00:000},
{id: 1247, name: butter, price: $7, expiry: 2019-11-23 00:00:00:000},
]
Я хотел бы изменить порядок списка таким образом, чтобы самая дальняя дата истечения срока действия отображалась первой:
25-11-2019
24-11-2019
23-11-2019
22-11-2019
22-11-2019
Что я пробовал (обновлял) -> РЕШЕНО, заменив a.expiry на a['expiry']:
products.sort((a,b) {
var adate = a['expiry'] //before -> var adate = a.expiry;
var bdate = b['expiry'] //var bdate = b.expiry;
return -adate.compareTo(bdate);
});
в функции сортировки я получаю эту ошибку (РЕШЕНО вышеуказанным исправлением):
Unhandled Exception: NoSuchMethodError: Class
'_InternalLinkedHashMap<String, dynamic>'has no instance getter 'expiry'.
спасибо, я уже разобрал дату, прежде чем назначать ее продуктам, пожалуйста, смотрите обновление выше
final format = DateFormat('yyyy-M-d H:m:s:S'); final array = [ '2019-11-24 00:00:00:000', '2019-11-22 00:00:00:000', '2019-11-23 00:00:00:000', '2019-11-25 00:00:00:000', '2019-11-22 00:00:00:000', ]; array.map(format.parse).toList() ..sort((a, b) => -a.compareTo(b)) ..forEach(print);спасибо @pskink, кажется, ошибка на самом деле исходит от метода сортировки, пытающегося получить expiry, выдает эту ошибку: Unhandled Exception: NoSuchMethodError: Class '_InternalLinkedHashMap<String, dynamic>' has no instance getter 'expiry'
спасибо, @pskink, да, я получаю эту ошибку «нет экземпляра геттера с истечением срока действия», см. Последний сегмент вопроса выше.
нет, в моем коде нет expiry, сначала запустите мой код как есть (без каких-либо изменений), посмотрите, как он работает, и, наконец, соответствующим образом измените свой код - в основном ключ находится в конструкторе DateFormat() и как обрабатывается метод sort
@pskink, спасибо!! я заставил его работать, извините, да, я не запускал ваш код отдельно, моя ошибка заключалась в том, что я просто модифицировал свои собственные коды. Так что на самом деле это было в a.expiry, я переключил его на a['expiry'], теперь он правильно переупорядочивает, я попытался переключить adate.compareTo(bdate) и -bdate.compareTo(adate), чтобы подтвердить, и заказ работает потрясающе! Спасибо большое. Вы можете опубликовать это как ответ, чтобы я мог отметить это, пожалуйста?
конечно, добро пожаловать, не стесняйтесь публиковать ответ на свой вопрос
Я опубликовал свой ответ, спасибо @pskink!! удачного кодирования :)





В приведенном выше примере expiry — это String, а не объект DateTime. Здесь у вас есть несколько вариантов, в зависимости от того, чего вы хотите достичь.
Самым простым решением было бы использовать встроенный в String метод compareTo, который позволяет сортировать строки. Эти временные метки уже находятся в сортируемом формате, так что это сработает:
products.sort((a,b) {
return a.compareTo(b);
});
Или более кратко:
products.sort((a,b) => a.compareTo(b));
Это довольно просто. Как и pskink, упомянутый в комментарии, основываясь на этом, вы можете преобразовать строки в фактические объекты DateTime.
DateTime expiryAsDateTime = DateTime.parse(expiry);
DateTime также имеет встроенный метод compareTo, поэтому приведенный выше фрагмент кода будет работать как с DateTimes, так и со строками.
Если вы хотите изменить порядок, просто поменяйте местами a и b.
спасибо @MichaelM за ваш ответ, я уже проанализировал дату, прежде чем назначать ее в список продуктов. Кстати, какой порядок это на самом деле вернет? что, если я хочу противоположный порядок, как я могу изменить эту функцию, которую вы упомянули выше products.sort((a,b) => a.compareTo(b));
compareTo сортирует в порядке возрастания. Если вы хотите поменять порядок, вы можете просто сделать это: products.sort((a,b) => b.compareTo(a)); Я связал документацию в своем ответе.
Приятно! спасибо @MichaelM, теперь ошибка в основном связана с функцией сортировки после проверки журнала, я думаю, что функция сортировки не может получить доступ к expiry в списке. пожалуйста, посмотрите последний сегмент моего обновленного вопроса об ошибке
Спасибо! Я исправил ошибку, используя ваш первый предложенный метод!
конвертировать в DateTime
import 'package:intl/intl.dart';
void main() {
List products = [
"2019-11-25 00:00:00.000",
"2019-11-22 00:00:00.000",
"2019-11-22 00:00:00.000",
"2019-11-24 00:00:00.000",
"2019-11-23 00:00:00.000"
];
List<DateTime> newProducts = [];
DateFormat format = DateFormat("yyyy-MM-dd");
for (int i = 0; i < 5; i++) {
newProducts.add(format.parse(products[i]));
}
newProducts.sort((a,b) => a.compareTo(b));
for (int i = 0; i < 5; i++) {
print(newProducts[i]);
}
}
без преобразования в DateTime
import 'package:intl/intl.dart';
void main() {
List products = [
"2019-11-25 00:00:00.000",
"2019-11-22 00:00:00.000",
"2019-11-22 00:00:00.000",
"2019-11-24 00:00:00.000",
"2019-11-23 00:00:00.000"
];
products.sort((a,b) => a.compareTo(b));
for (int i = 0; i < 5; i++) {
print(products[i]);
}
}
Я исправил это, изменив changing a.expiry into a['expiry'] и b.expiry into b['expiry']
products.sort((a,b) {
var adate = a['expiry'] //before -> var adate = a.expiry;
var bdate = b['expiry'] //before -> var bdate = b.expiry;
return adate.compareTo(bdate); //to get the order other way just switch `adate & bdate`
});
Если вы хотите отсортировать объекты по имени свойства без использования DateTime, предполагая, что дата и время являются строкой, сделайте следующее:
products.sort((a, b)=> a['expiry'].compareTo(b['expiry']));
Если у вас есть что-то вроде:
{
"id": 100,
"timestamp": "2021-02-02T15:15:11Z",
"name": "Entry1"
}
Затем сделайте следующее:
List<Values> _myList = [];
_myList.sort((a,b)=> a["timestamp"].compareTo(b["timestamp"]));
Или как в моем коде:
task.sort((a,b) => a.createdAt.compareTo(b.createdAt));
Если мы станем более конкретными, то попробуйте, как этот.
это сработало отлично для меня
transactionList.sort((a, b) {
int aDate = DateTime.parse(a.dateTime ?? '').microsecondsSinceEpoch;
int bDate = DateTime.parse(b.dateTime ?? '').microsecondsSinceEpoch;
return aDate.compareTo(bDate);
});
см.
DateFormat.parseметод