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()
构造函数将其更改为javascript
date
对象。通过这种方式,您可以对它们进行排序(使用
。.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'])