2016-12-05 153 views
3

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

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()转换日期属性,但这没有什么区别。

谢谢。

+0

那些是日期对象或日期字符串? – andlrc

+0

标准的Javascript日期字符串。正如我所说,如果需要,我可以先用Moment将它们转换为另一种格式,但转换为unix似乎不起作用,并且这似乎是最简单的排序格式。 – wonder95

+0

值是日期还是字符串? – Dekel

回答

14

你并不真的需要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);

+0

它具有很好的浏览器支持。自从ECMAScript 3以来它一直处于规范中,这意味着它适用于所有浏览器。 (甚至IE7) –

+2

由于OP有moment.js,所以它应该用于解析日期,而不是内置日期。 – RobG

2

您的日期值是字符串,因此您需要使用构造函数new Date()将它们更改为javascript对象。这样您可以对它们进行分类(使用_.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>

1

下面是使用标准JavaScript由两个值转换为日期对象和比较它们的值的溶液中。

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

一个完整的片段:

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