Сортировка в Javascript - PullRequest
       1

Сортировка в Javascript

2 голосов
/ 10 апреля 2011

Я бы хотел отсортировать по времени, дню. Вот моя попытка:

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

Это не проверено, но я делаю это правильно? (Время 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;

Мое решение, которое, кажется, работает благодаря @ T.J. 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;
    }
});

Сжатый:

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

1 Ответ

5 голосов
/ 10 апреля 2011

Ваш фундаментальный подход - это звук. Несколько заметок:

  1. Вы не используете days в качестве массива, поэтому я бы не стал делать его массивом. Вместо этого:

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

    Кроме того, вам не нужны эти кавычки, поскольку ни одна из этих строк не является ключевым словом, поэтому:

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

    ... но вы можете оставить их как стиль или защитить от добавления тех, которые являются ключевыми словами позже.

  2. Вам не нужно использовать заключенную в скобки нотацию для поиска свойства (a['day']), если только строка, которую вы используете для имени свойства, не является динамической или имя свойства является зарезервированным словом. day не является ни тем, ни другим, поэтому вы можете использовать более простые точечные обозначения (a.day).

  3. В JavaScript нет elseif; используйте else if.

  4. Вы можете упростить это:

    return (days[a['day']] < days[b['day']]) ? 1 : -1;
    

    до

    return days[a.day] - days[b.day];
    

    .. и вы можете сделать что-то похожее с вашими 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;
        }
    });
    

    ... или вы можете сжать его дальше:

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

Живой пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...