所以我有一个对象数组,我想按照这两个规则(按优先级顺序)对它们进行排序:
所以,我希望这些对象不仅要按数字排序,还要按时间排序。 例如,这没关系。
这是我们感兴趣的部分对象的结构:
var notSortedData = {
number: number, // it's a string
scheduled_date: scheduled_date, // the format is "YYYY-MM-DD HH:MM:SS"
}
sortedTrains.push(notSortedData);
因此,notSortedData
通过sortedTrains
循环推送到for
。然后我这样做,但这还不够(因为它不尊重我的第二个条件):
// sorts all the numbers numerically
sortedTrains.sort(function(a, b) {
return parseInt(a.number) - parseInt(b.number);
});
我需要做些什么来确保我的第二个条件也得到尊重?谢谢!
答案 0 :(得分:2)
你可以试试这个:
sortedTrains.sort(function(a, b) {
// We parse the numbers
var num1 = parseInt(a.number), num2 = parseInt(b.number);
if (num1 != num2) return num1 - num2; // Return the difference IF they are not equal
var date1 = new Date(a.scheduled_date), date2 = new Date(b.scheduled_date);
// We only get here if the numbers are equal
return date1 - date2;
});
答案 1 :(得分:0)
我建议使用诸如下划线或lo-Dash之类的库,因为稍后您可能会添加更多排序条件或更改它们,并且使用该库将大大减少代码的噪音并节省您的开发工作量。假设使用了lo-Dash,代码将如下所示:
var sortedTrains = [
{ 'number': 5, 'scheduled_date': '2014-10-12 00:00:00'},
{ 'number': 5, 'scheduled_date': '2014-10-12 01:00:00' },
{ 'number': 5, 'scheduled_date': '2014-10-12 02:00:00'},
{ 'number': 6, 'scheduled_date': '2014-10-12 03:00:00' }
];
var result = _.sortBy(sortedTrains, ['number', 'scheduled_date']);