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

时间:2019-07-12 04:27:07

标签: flutter dart

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

$('.select1').on('change', function() {
    $('.select2').val($(this).val())
})

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

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

5 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

我通过更改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`
});

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

转换为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"
  ];
  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]);
  }
}

答案 4 :(得分:-1)

使用静态扩展方法排序:
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'
  },
];