【问题标题】:Sort array of objects following multiple rules in javascript在javascript中按照多个规则对对象数组进行排序
【发布时间】:2014-12-07 08:40:50
【问题描述】:

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

  1. 数字必须按数字顺序排列
  2. 时间必须按时间顺序排列

所以,我希望对象不仅可以按数字排序,还可以按时间排序。 例如,这样就可以了。

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

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

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 通过for 循环推入sortedTrains。然后我这样做,但这还不够(因为它不尊重我的第二个条件):

// sorts all the numbers numerically
        sortedTrains.sort(function(a, b) {
            return parseInt(a.number) - parseInt(b.number);
        });

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

【问题讨论】:

  • 我需要做些什么来确保我的第二个条件也得到遵守?试试这个:var d = parseInt(a.number) - parseInt(b.number); return d == 0? a.scheduled_date - b.scheduled_date : d;。虽然这不考虑按日期/时间排序

标签: javascript jquery arrays sorting javascript-objects


【解决方案1】:

你可以试试这个:

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

【讨论】:

  • 似乎工作正常,我马上确认!
【解决方案2】:

我建议使用下划线或 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']);

【讨论】:

  • 下次我会记住的。谢谢!
猜你喜欢
  • 2023-02-05
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多