在Javascript中排序

Ste*_*ven 2 javascript sorting

我想按时间排序.这是我的尝试:

var days = new Array();
var days['SU'] = 0;
var days['MO'] = 1;
var days['TU'] = 2;
var days['WE'] = 3;
var days['TH'] = 4;
var days['FR'] = 5;
var days['SA'] = 6;

events.sort(function(a, b)
{
    if(a['day'] != b['day'])
    {
        return (days[a['day']] < days[b['day']]) ? 1 : -1;
    }
    else if(a['time'] != b['time'])
    {
        return (a['time'] < a['time']) ? 1 : -1;
    }
    else
        return 0;
);
Run Code Online (Sandbox Code Playgroud)

它没有经过测试,但我做得对吗?(时间asc,天asc)星期一早上8点,星期二上午8点,星期一晚上9点是我正在寻找的订单.

干杯.

events[0]['day'] = 'MO';
events[0]['time'] = 8;
events[1]['day'] = 'MO';
events[1]['time'] = 21;
events[2]['day'] = 'TU';
events[2]['time'] = 8;
Run Code Online (Sandbox Code Playgroud)

我的解决方案似乎有效,感谢@TJ Crowder

events = new Array();
events[0] = new Array();
events[0]['day'] = 'MO';
events[0]['time'] = 8;
events[1] = new Array();
events[1]['day'] = 'MO';
events[1]['time'] = 21;
events[2] = new Array();
events[2]['day'] = 'TU';
events[2]['time'] = 8;

var days = {
    'SU': 0,
    'MO': 1,
    'TU': 2,
    'WE': 3,
    'TH': 4,
    'FR': 5,
    'SA': 6
};

events.sort(function(a, b)
{
    if (a.time != b.time)
    {
        return a.time - b.time;
    }
    else if (a.day != b.day)
    {
        return days[a.day] - days[b.day];
    }
    else
    {
        return 0;
    }
});
Run Code Online (Sandbox Code Playgroud)

凝结:

events.sort(function(a, b)
{
    return a.time != b.time
       ? a.time - b.time
       : days[a.day] - days[b.day];
});
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 5

你的基本方法是合理的.几点说明:

  1. 你不是days用作数组,所以我不会把它变成数组.代替:

    var days = {
        'SU': 0,
        'MO': 1,
        'TU': 2,
        'WE': 3,
        'TH': 4,
        'FR': 5,
        'SA': 6
    };
    
    Run Code Online (Sandbox Code Playgroud)

    此外,您不需要这些引号,因为这些字符串都不是关键字,因此:

    var days = {
        SU: 0,
        MO: 1,
        TU: 2,
        WE: 3,
        TH: 4,
        FR: 5,
        SA: 6
    };
    
    Run Code Online (Sandbox Code Playgroud)

    ...但你可以选择将它们作为一种风格的东西,或者防止在以后添加关键词.

  2. a['day']除非您用于属性名称的字符串是动态的或属性名称是保留字,否则您不必使用括号中的符号来查找属性().day既不是,所以你可以使用更简单的点缀符号(a.day).

  3. elseifJavaScript中没有; 用else if.

  4. 你可以简化这个:

    return (days[a['day']] < days[b['day']]) ? 1 : -1;
    
    Run Code Online (Sandbox Code Playgroud)

    return days[a.day] - days[b.day];
    
    Run Code Online (Sandbox Code Playgroud)

    ..你可能能够做一些与你的time价值观相似的东西,但我不知道它们是什么,所以......现在你已经发布了它们,我做了,你可以.

  5. 强烈建议总是使用牙箍,而不仅仅是当你"需要"它们时.(你的三个分支实际上都不需要它们,但你只在两个分支上使用它们.)

  6. 你比较了a['time'],a['time]而不是b['time']检查平等.

  7. 你还没有结束你的功能(缺少})

  8. 由于您可以减去您的time值,因此您不需要进行最终的等式检查.

    所以:

    events.sort(function(a, b)
    {
        if (a.day != b.day)
        {
            return days[a.day] - days[b.day];
        }
        else
        {
            return a.time - b.time;
        }
    });
    
    Run Code Online (Sandbox Code Playgroud)

    ......或者你可以进一步浓缩它:

    events.sort(function(a, b)
    {
        return (a.day != b.day
               ? days[a.day] - days[b.day]
               : a.time - b.time);
    });
    
    Run Code Online (Sandbox Code Playgroud)

实例