簡體   English   中英

如何在 dart/flutter 中按日期對列表進行排序/排序?

[英]How to sort/order a list by date in 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},

]

我想以最遠到期日期最先顯示的方式重新排序列表:

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

在上面的示例中, 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方法,因此上面的代碼片段可以與 DateTimes 和 Strings 一起使用。

如果您想顛倒順序,只需交換ab

我通過將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`
});

轉換為日期時間

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

如果您想按屬性名稱對對象進行排序而不必使用 DateTime 假設日期和時間是字符串,請執行以下操作:

products.sort((a, b)=> a['expiry'].compareTo(b['expiry']));

使用靜態擴展方法排序:
select方法將expired值轉換為DateTime類型的值。
orderBy方法按DateTime類型的值(e['expiry'] as DateTime )對序列進行排序。

import 'package:enumerable/enumerable.dart';
import 'package:intl/intl.dart';

void main() {
  final fmt = DateFormat('yyyy-M-d H:m:s:S');
  final query = rawProducts
      .select((p) => p..['expiry'] = fmt.parse(p['expiry'] as String))
      .orderBy((e) => e['expiry'] as DateTime);

  final products = query.toList();
  print(products);
}

List rawProducts = [
  {
    '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'
  },
];

如果你有類似的東西:

{
"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);
});

對我來說,我需要在 compareTo 之前先使用 DateTime.parse

https://www.fluttercampus.com/guide/169/how-to-sort-list-by-date-in-dart-flutter/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM