Javascript 按日期对带有日期字段的对象数组进行排序
给定以下对象数组,我需要按日期字段升序对它们进行排序Javascript 按日期对带有日期字段的对象数组进行排序,javascript,sorting,date,lodash,Javascript,Sorting,Date,Lodash,给定以下对象数组,我需要按日期字段升序对它们进行排序 var myArray = [ { name: "Joe Blow", date: "Mon Oct 31 2016 00:00:00 GMT-0700 (PDT)" }, { name: "Sam Snead", date: "Sun Oct 30 2016 00:00:00 GMT-0700 (PDT)" }, { name: "John Smith", date: "S
var myArray = [
{
name: "Joe Blow",
date: "Mon Oct 31 2016 00:00:00 GMT-0700 (PDT)"
},
{
name: "Sam Snead",
date: "Sun Oct 30 2016 00:00:00 GMT-0700 (PDT)"
},
{
name: "John Smith",
date: "Sat Oct 29 2016 00:00:00 GMT-0700 (PDT)"
}
];
所以在这个例子中,最终的结果是约翰·史密斯,山姆·斯奈德和乔·布鲁
我正在尝试使用lodash's,但无论我如何尝试使用它,我都无法进行任何排序:
_.sortBy(myArray, function(dateObj) {
return dateObj.date;
});
或
要使数组正确排序,我需要更改什么?我还有Moment.js,因此如果需要,我可以使用它格式化日期字符串。我尝试使用.unix()转换date属性,但没有任何区别
谢谢。您的日期值是字符串,因此需要使用
new date()
构造函数将其更改为javascriptdate
对象。通过这种方式,您可以对它们进行排序(使用。.sortBy
)
var myArray=[
{
名字:“乔·布鲁”,
日期:“2016年10月31日星期一00:00:00 GMT-0700(PDT)”
},
{
姓名:“山姆·斯奈德”,
日期:“2016年10月30日星期日00:00:00 GMT-0700(PDT)”
},
{
姓名:“约翰·史密斯”,
日期:“2016年10月29日星期六00:00:00 GMT-0700(PDT)”
}
];
myArray=uzy.sortBy(myArray,函数(dateObj){
返回新日期(dateObj.Date);
});
console.log(myArray)
这里有一个使用标准Javascript的解决方案,它将两个值转换为date对象并比较它们的值
myArray.sort((d1, d2) => new Date(d1.date).getTime() - new Date(d2.date).getTime());
完整的代码片段:
var myArray=[
{
名字:“乔·布鲁”,
日期:“2016年10月31日星期一00:00:00 GMT-0700(PDT)”
},
{
姓名:“山姆·斯奈德”,
日期:“2016年10月30日星期日00:00:00 GMT-0700(PDT)”
},
{
姓名:“约翰·史密斯”,
日期:“2016年10月29日星期六00:00:00 GMT-0700(PDT)”
}
];
myArray.sort((d1,d2)=>新日期(d1.Date).getTime()-新日期(d2.Date).getTime());
log(myArray)代码>您实际上不需要洛达斯。您可以使用JavaScript的Array.prototype.sort
方法
在比较日期字符串之前,需要从日期字符串创建Date
对象
var myArray=[{
名字:“乔·布鲁”,
日期:“2016年10月31日星期一00:00:00 GMT-0700(PDT)”
}, {
姓名:“山姆·斯奈德”,
日期:“2016年10月30日星期日00:00:00 GMT-0700(PDT)”
}, {
姓名:“约翰·史密斯”,
日期:“2016年10月29日星期六00:00:00 GMT-0700(PDT)”
}];
排序(函数比较(a,b){
var dateA=新日期(a.Date);
var dateB=新日期(b.日期);
返回日期a-日期b;
});
log(myArray)代码>只需通过({yourCollection},{fieldname})编写\uu.sortBy代码>
lodash会自动判断这是一个日期,它会像魔术一样工作
太棒了 如果您试图使用lodash对对象数组的日期进行升序或降序排序,则应使用.orderBy
而不是.sortBy
,此方法允许通过“asc”或“desc”指定排序顺序
例如:
const sortedArray = _(myArray.orderBy([
function(object) {
return new Date(object.date);
}],["desc"])
使用Lodash的更清洁方法:
这些是日期对象还是日期字符串?标准Javascript日期字符串。正如我所说,如果需要的话,我可以使用Moment first将它们转换为另一种格式,但是转换到unix似乎不起作用,而且这似乎是最简单的排序格式。值是日期还是字符串?。sortBy
似乎没有进行排序(与数组排序方法不同)。sortBy(myArray,['date'])
应该可以。对于'2018-08-28T17:38:00'
日期格式,它可以工作。并且它具有强大的浏览器支持。它从ECMAScript 3开始就在规范中,这意味着它可以在所有浏览器中工作。(甚至IE7)由于OP有moment.js,因此应该使用它来解析日期,而不是内置的Date.JavaScript排序是不稳定的排序,lodash sortBy和orderBy是稳定的。我在这方面遇到了一个问题,洛达斯解决了这个问题此方法执行稳定排序,即保留相等元素的原始排序顺序。
添加safari时,其排序方式也有所不同。如果你已经拥有lodash或其他库,那么最好使用它们。lodash真的会自动检测到这一点吗?即使提供的日期是ISO字符串?@Marek,yes lodash也会自动检测字符串是否为ISO日期字符串,因此它会将其排序为日期:)在此处传递数组的位置?@lãjî-第一个参数是数组,即.orderBy(您的数组,['asc'])
。另外,asc
可以是desc
也可以用于降序排序,而不是升序排序…请参阅更多信息
const sortedArray = _(myArray.orderBy([
function(object) {
return new Date(object.date);
}],["desc"])
import _ from 'lodash'
const sortedArray = _.orderBy(myArray, [(obj) => new Date(obj.date)], ['asc'])