代码之家  ›  专栏  ›  技术社区  ›  Manas

如何在dart/flutter中按日期对列表排序?

  •  0
  • Manas  · 技术社区  · 5 年前

    我有下面的清单,我正试图重新排序/排序的日期时间。

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

    在sort函数上,我收到了这个错误(通过上面的修复解决):

    Unhandled Exception: NoSuchMethodError: Class 
    '_InternalLinkedHashMap<String, dynamic>'has no instance getter 'expiry'.
    
    0 回复  |  直到 5 年前
        1
  •  46
  •   MichaelM    5 年前

    在你上面的例子中, expiry 是一个 String ,不是DateTime对象。你有几个选择,这取决于你想要实现什么。

    最简单的解决方案是使用字符串的内置 compareTo

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

    或更简洁:

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

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

    DateTime expiryAsDateTime = DateTime.parse(expiry);
    

    DateTime 还有一个内置的 比较函数 方法,因此上面的代码段可以处理DateTimes和字符串。

    如果你想颠倒顺序,就交换一下 a b .

        2
  •  14
  •   Manas    5 年前

    我改了 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`
    });
    
        3
  •  4
  •   user9139407    5 年前

    转换为日期时间

    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]);
      }
    }
    
        4
  •  0
  •   MosesAyo    4 年前

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

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