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

Mik*_*chy 5 dart flutter

我有以下列表,我想按日期时间重新排序/排序。

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},

]
Run Code Online (Sandbox Code Playgroud)

我想以最远的到期日最先出现的方式对列表进行重新排序:

 25-11-2019
 24-11-2019
 23-11-2019
 22-11-2019
 22-11-2019
Run Code Online (Sandbox Code Playgroud)

我尝试过的(更新)->通过更改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);
  });
Run Code Online (Sandbox Code Playgroud)

在排序功能上,我收到此错误(已通过上述修复解决):

Unhandled Exception: NoSuchMethodError: Class 
'_InternalLinkedHashMap<String, dynamic>'has no instance getter 'expiry'.
Run Code Online (Sandbox Code Playgroud)

Mik*_*chy 15

我通过改变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`
});
Run Code Online (Sandbox Code Playgroud)


paa*_*jis 14

如果你有类似的东西:

{
"id": 100,
"timestamp": "2021-02-02T15:15:11Z",
"name": "Entry1"
}
Run Code Online (Sandbox Code Playgroud)

然后执行以下操作:

List<Values> _myList = [];
_myList.sort((a,b)=> a["timestamp"].compareTo(b["timestamp"])); 
Run Code Online (Sandbox Code Playgroud)

或者像我的代码一样:

task.sort((a,b) => a.createdAt.compareTo(b.createdAt));
Run Code Online (Sandbox Code Playgroud)

来源


Sai*_*lam 11

如果我们变得更具体,那么尝试像这样。

它对我来说非常有效


transactionList.sort((a, b) {
  int aDate = DateTime.parse(a.dateTime ?? '').microsecondsSinceEpoch;
  int bDate = DateTime.parse(b.dateTime ?? '').microsecondsSinceEpoch;
  return aDate.compareTo(bDate);
});

Run Code Online (Sandbox Code Playgroud)


Mic*_*elM 7

在上面的示例中,expiry是一个String,而不是DateTime对象。根据您要实现的目标,这里有一些选择。

最简单的解决方案是使用String的内置compareTo方法,该方法允许对String进行排序。这些时间戳已经是可排序的格式,因此可以使用:

products.sort((a,b) {
    return a.compareTo(b);
 });
Run Code Online (Sandbox Code Playgroud)

或更简洁:

products.sort((a,b) => a.compareTo(b));
Run Code Online (Sandbox Code Playgroud)

这是很基本的。就像注释中提到的pskink一样,可以在此基础上将字符串转换为实际的DateTime对象。

DateTime expiryAsDateTime = DateTime.parse(expiry);
Run Code Online (Sandbox Code Playgroud)

DateTime还具有一个内置compareTo方法,因此上面的代码段将与DateTimes以及Strings一起使用。

如果要取消顺序,只需交换a和即可b。

  • CompareTo 按升序排序。如果你想交换顺序,你可以这样做:`products.sort((a,b) =&gt; b.compareTo(a));` 我已经在我的答案中链接了文档 (2认同)

use*_*407 7

转换为日期时间

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]);
  }
}
Run Code Online (Sandbox Code Playgroud)

不转换为日期时间

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]);
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

如果要按属性名称对对象进行排序,而不必使用 DateTime(假设日期和时间是字符串),请执行以下操作:

products.sort((a, b)=> a['expiry'].compareTo(b['expiry']));
Run Code Online (Sandbox Code Playgroud)