关于javascript:按日期对对象数组进行排序

Sort array of objects with date field by date

给出以下对象数组,我需要按日期字段升序对它们进行排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)"  
  }
];

因此在此示例中,最终结果将是John Smith,Sam Snead和Joe Blow。

我正在尝试使用lodash的_.sortBy(),但是无论如何尝试,都无法进行任何排序:

1
2
3
_.sortBy(myArray, function(dateObj) {
  return dateObj.date;
});

1
_.sortBy(myArray, 'date');

为了使阵列正确排序,我需要更改什么?我也有Moment.js,因此如果需要,我可以使用它来格式化日期字符串。我尝试使用.unix()转换date属性,但这没什么区别。

谢谢。


您真的不需要lodash。您可以使用JavaScript的Array.prototype.sort方法。

您需要先根据日期字符串创建date对象,然后才能进行比较。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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)"
}];

myArray.sort(function compare(a, b) {
  var dateA = new Date(a.date);
  var dateB = new Date(b.date);
  return dateA - dateB;
});

console.log(myArray);


您的日期值是字符串,因此您需要使用new Date()构造函数将其更改为javascript date对象。这样,您可以对它们进行排序(使用_.sortBy)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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)"  
  }
];

myArray = _.sortBy(myArray, function(dateObj) {
  return new Date(dateObj.date);
});

console.log(myArray)
1
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.min.js">


这是使用标准Javascript的解决方案,方法是将两个值都转换为date对象并比较它们的值。

1
myArray.sort((d1, d2) => new Date(d1.date).getTime() - new Date(d2.date).getTime());

完整的代码段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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)"  
  }
];

myArray.sort((d1, d2) => new Date(d1.date).getTime() - new Date(d2.date).getTime());

console.log(myArray);


如果尝试使用lodash对对象数组按升序或降序对日期进行排序,则应使用_.orderBy而不是_.sortBy

https://lodash.com/docs/4.17.15#orderBy,此方法允许按" asc"或" desc"指定排序顺序

一个例子是:

1
2
3
4
const sortedArray = _(myArray.orderBy([
      function(object) {
        return new Date(object.date);
      }],["desc"])

只写_.sortBy({yourCollection}, {the field name});

lodash会自动认为这是一个日期,它将像魔术一样起作用!

太棒了!