如何在飞镖/颤振中按日期对列表进行排序/排序?
Posted
技术标签:
【中文标题】如何在飞镖/颤振中按日期对列表进行排序/排序?【英文标题】:How to sort/order a list by date in dart/flutter? 【发布时间】:2019-11-21 19:40:54 【问题描述】:我有以下列表,我正在尝试按日期时间重新排序/排序。
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'.
【问题讨论】:
见DateFormat.parse
方法
谢谢,我在分配给产品之前已经解析了日期,请看上面的更新
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,是的,我做到了,我收到此错误“没有 getter 'expiry' 实例,请参阅上述问题的最后一部分。
【参考方案1】:
如果你有类似的东西:
"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));
Source
【讨论】:
【参考方案2】:如果您想按属性名称对对象进行排序,而不必使用 DateTime 假设日期和时间是一个字符串,请执行以下操作:
products.sort((a, b)=> a['expiry'].compareTo(b['expiry']));
【讨论】:
【参考方案3】:我通过更改 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`
);
【讨论】:
【参考方案4】:转换为日期时间
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]);
【讨论】:
【参考方案5】:在上面的示例中,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
方法,因此上面的代码 sn-p 可以与 DateTimes 以及 Strings 一起使用。
如果您想颠倒顺序,只需交换a
和b
。
【讨论】:
感谢@MichaelM 的回答,我已经解析了日期,然后再将其分配到产品列表中。顺便说一句,这实际上会返回什么订单?如果我想要相反的顺序怎么办我该如何修改你上面提到的这个功能products.sort((a,b) => a.compareTo(b));
compareTo 以升序排列。如果你想交换订单,你可以这样做:products.sort((a,b) => b.compareTo(a));
我已经在我的答案中链接了文档
不错!谢谢@MichaelM,现在检查日志后错误主要出在排序功能上,我认为排序功能无法访问列表中的expiry
。请查看我更新问题的最后一部分以了解错误
谢谢!我已使用您建议的第一个方法修复了错误!以上是关于如何在飞镖/颤振中按日期对列表进行排序/排序?的主要内容,如果未能解决你的问题,请参考以下文章