如何在飞镖/颤振中按日期对列表进行排序/排序?

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) =&gt; -a.compareTo(b)) ..forEach(print); 谢谢@pskink,似乎错误实际上来自试图获取expiry的排序方法抛出此错误:Unhandled Exception: NoSuchMethodError: Class '_InternalLinkedHashMap&lt;String, dynamic&gt;' 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】:

在上面的示例中,expiryString,而不是 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 一起使用。

如果您想颠倒顺序,只需交换ab

【讨论】:

感谢@MichaelM 的回答,我已经解析了日期,然后再将其分配到产品列表中。顺便说一句,这实际上会返回什么订单?如果我想要相反的顺序怎么办我该如何修改你上面提到的这个功能products.sort((a,b) =&gt; a.compareTo(b)); compareTo 以升序排列。如果你想交换订单,你可以这样做:products.sort((a,b) =&gt; b.compareTo(a));我已经在我的答案中链接了文档 不错!谢谢@MichaelM,现在检查日志后错误主要出在排序功能上,我认为排序功能无法访问列表中的expiry。请查看我更新问题的最后一部分以了解错误 谢谢!我已使用您建议的第一个方法修复了错误!

以上是关于如何在飞镖/颤振中按日期对列表进行排序/排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何对实例类列表进行排序取决于其在飞镖或颤振中的属性[重复]

如何在VB中按某个组件对对象列表进行排序?

在python中按日期时间对字典列表进行排序

如何在 MongoDB 中按日期对集合进行排序?

在Python 3.4中按日期对字典列表进行排序[重复]

如何在 Dart 中按“枚举”对列表进行排序?