按照javascript中的多个规则对对象数组进行排序

时间:2014-10-12 19:05:41

标签: javascript jquery arrays sorting javascript-objects

所以我有一个对象数组,我想按照这两个规则(按优先级顺序)对它们进行排序:

  1. 数字必须按数字顺序
  2. 时间必须按时间顺序排列
  3. 所以,我希望这些对象不仅要按数字排序,还要按时间排序。 例如,这没关系。

    • 005:2am
    • 005:3am
    • 005:凌晨4点
    • 006:2am
    • 006:3am

    这是我们感兴趣的部分对象的结构:

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

    我需要做些什么来确保我的第二个条件也得到尊重?谢谢!

2 个答案:

答案 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']);