按日期对具有日期字段的对象数组进行排序

时间:2016-12-05 01:12:25

标签: 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: "Sat Oct 29 2016 00:00:00 GMT-0700 (PDT)"  
  }
];

所以在这个例子中,最终结果将是John Smith,Sam Snead和Joe Blow。

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

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

_.sortBy(myArray, 'date');

我需要更改什么才能正确排列数组?我也有Moment.js,所以我可以根据需要使用它来格式化日期字符串。我尝试使用.unix()转换日期属性,但这没有什么区别。

感谢。

7 个答案:

答案 0 :(得分:40)

你真的不需要lodash。只需使用JavaScript的Array.prototype.sort方法。

您需要先从日期字符串中创建Date个对象,然后才能比较它们。



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




答案 1 :(得分:7)

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



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)

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.min.js"></script>
&#13;
&#13;
&#13;

答案 2 :(得分:3)

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

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

一个完整的代码段:

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 3 :(得分:1)

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

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

太棒了!

答案 4 :(得分:1)

使用 Lodash orderBy 的一种更简洁的方法:

import _ from 'lodash'

const sortedArray = _.orderBy(myArray, [(obj) => new Date(obj.date)], ['asc'])

答案 5 :(得分:0)

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

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

一个例子是:

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

答案 6 :(得分:0)

const 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)"
}];

console.log(myArray.sort((a, b) => a - b));