当前位置: 首页 > 知识库问答 >
问题:

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

董子航
2023-03-14

我有下面的列表,我试着按日期时间重新排序。

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

我尝试过的(更新)-

  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'.

共有3个答案

丌官和泰
2023-03-14

转换为日期时间

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

不转换为日期时间

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]);
  }
}
艾望
2023-03-14

我通过修改<code>将a.expiry改为〔‘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`
});
邬楚青
2023-03-14

在上面的示例中,< code>expiry是一个< code >字符串,而不是一个DateTime对象。你有几个选择,取决于你想实现什么。

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

products.sort((a,b) {
    return a.compareTo(b);
 });

或更简洁:

products.sort((a,b) => a.compareTo(b));

这是非常基本的。与评论中提到的pskink一样,在此基础上,您可以将字符串转换为实际的日期时间对象。

DateTime expiryAsDateTime = DateTime.parse(expiry);

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

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

 类似资料:
  • 我有这样一个情况: 我必须对进行排序,该列表还包含的ID,排序必须为: null

  • 问题内容: 获取目录中所有文件的列表的最佳方法是什么,按日期排序[创建| 修改],在Windows机器上使用python? 问题答案: 这@Greg Hewgill是答案的更详细的版本。这是最符合问题要求的。它区分了创建日期和修改日期(至少在Windows上如此)。 例:

  • 问题内容: 我将MongoDB与Node.JS结合使用。我有一个包含日期和其他行的集合。日期是一个JavaScript 对象。 如何按日期排序此收藏集? 问题答案: 只需对@JohnnyHK答案进行一些修改 在许多用例中,我们希望返回最新记录(例如最新更新/插入)。

  • 问题内容: 如何对日期和/或日期时间对象列表进行排序?接受的答案在这里是不是为我工作: 问题答案: 你得到,因为它运行 在原地 ,这意味着它不返回任何东西,但修改列表本身。您只需要呼叫而无需再次分配。 有一个内置函数,该函数返回列表的排序版本-也会执行您想要的操作。

  • 问题内容: 如何排序日期对象列表?例如,我有未排序的日期对象列表。如何从此列表中获取最大值/最小值? 问题答案: 使用列表排序方法: 有关如何排序的更多信息。

  • 我正在为我叔叔做一个应用程序,他让我做来挑战我。我认为这是学习颤振/飞镖的绝佳机会。我有这段代码(下面),但我需要它按日期时间组织一个列表(第77行)。每个条目至少有一个字符串id、一个DateTime变量、一个字符串名称和一些正文文本。