我有以下列表,我想按日期时间重新排序/排序。
$('.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);
});
答案 0 :(得分:3)
在上面的示例中,expiry
是String
,而不是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。
如果要撤消订单,只需交换a
和b
。
答案 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'
},
];