Использование сортировщика таблиц jQuery для сортировки дат мм/гг

Я использую плагин jquery tablesorter для сортировки таблицы. В одном из моих столбцов в моей таблице отображается дата в формате мм/гг.

<tr>
    <td class="col-name">...</td>
    ...
    <td rel="2000" class="col-dob">10/00</td>
    ...
</tr>
<tr>
    <td class="col-name">...</td>
    ...
    <td rel="1986" class="col-dob">11/86</td>
    ...
</tr>

Примечание:

  • Каждая ячейка имеет уникальный класс
  • Дата отображается в формате мм/гг
  • Ячейка с датой также получает год

Мой код jQuery выглядит следующим образом:

// add parser through the tablesorter addParser method
$.tablesorter.addParser({
        // set a unique id
        id: 'user-birthdate',
        is: function(s) {
                // return false so this parser is not auto detected
                return false;
        },
        format: function(s) {
                // format your data for normalization

                var dateSplit = s.split('/');

                if(2 !== dateSplit.length)
                        return 0;

                return new Date(dateSplit[1], dateSplit[0], 1);
        },
        // set type, either numeric or text
        type: 'numeric'
});

myClass.init = function() {
        $('.module .user table').tablesorter({
                sortList: [[0,0]],     
             widgets: ['zebra'],
                headers: {
                        5: {
                                sorter:'user-birthdate'
                        }
                }
        });
}

myClass.init();

Моя проблема в том, что tableSorter интерпретирует 00 как 1900 год вместо 2000, и, следовательно, отсортированные данные неверны.

Любая подсказка, как я могу это решить? Я использую jQuery 1.2.6 и последнюю версию сортировщика таблиц.


person hitec    schedule 16.01.2009    source источник


Ответы (2)


Я обнаружил, что документация по сортировщику таблиц часто довольно бесполезна. Это выглядит так, как будто сказано много, но не хватает деталей.

В этом случае он не сообщает вам сигнатуру функции для синтаксического анализатора. К счастью, вы можете прочитать неминифицированный код, чтобы найти его.

Там мы обнаруживаем, что парсер metadata делает это:

format: function(s,table,cell) {

Это означает, что вы можете настроить метод форматирования следующим образом:

format: function(s, table, cell) {
    // format your data for normalization

    var dateSplit = s.split('/');
    var year = $(cell).attr('rel');

    if(2 !== dateSplit.length)
        return 0;

    return new Date(year, dateSplit[0], 1);
},

Или, по крайней мере, похоже на это. Я на самом деле не тестировал это. Но это должно быть как минимум очень близко.

person David    schedule 17.01.2009
comment
Спасибо, Дэвид. Ждем, чтобы проверить это в понедельник. Буду обновлять здесь. - person hitec; 18.01.2009
comment
Это решение устранило мою проблему. Спасибо, Дэвид. - person hitec; 19.01.2009
comment
Это также было полезно при сортировке столбца даты, в котором были пустые значения. Спасибо, что опубликовали это. - person Rich Reuter; 21.10.2009

Я думаю, вы обнаружите, что ваша проблема заключается в конструкторе Date и двухзначной строке года, которую вы передаете без неоднозначности: new Date(dateSplit[1], dateSplit[0], 1);

Я не думаю, что вы можете (легко) получить доступ к rel на основе s в парсере. Содержит ли s все содержимое ячейки? Можете ли вы сделать что-то с данными в ячейке, например: <span style="display : none">CC</span>MM/YY, удалить теги, а затем объединить CC с YY в вашем синтаксическом анализе?

person Cade Roux    schedule 16.01.2009
comment
К счастью, функция парсера также получает объект ячейки. Смотрите мой ответ. :) - person David; 17.01.2009