Как разобрать сложную строку с помощью плагина jQuery Tablesorter? - PullRequest
0 голосов
/ 27 декабря 2010

У меня есть такая таблица, которую я хочу отсортировать:
| Имя | Дело |
| Джон | X-123/08 P |
| Боб | X-123/09 |
| Дилан | X-45/10 |

Я хочу отсортировать столбец Case по году обращения, а затем по номеру дела, зная, что формат всегда «X- (от 1 до 4 цифр для номера дела) / (год дела из 2 цифр) (иногда некоторый текст)». Вполне возможно, что после года у меня будет какой-то текст, но он будет проигнорирован для сортировки.

Я использую плагин TableSorter jQuery и пытаюсь добавить для этого собственный анализатор.

Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ: Вот что я пытаюсь сделать:

jQuery.tablesorter.addParser({ 
                // set a unique id 
                id: 'case', 
                is: function(s) { 
                    return false; 
                }, 
                format: function(s) { 
                    // format your data for normalization 
                    return s.replace(/^X-\d{1,4}\/(\d{2}).*$/, '$1') + ('000' + s.replace(/^X-(\d{1,4})\/\d{2}.*$/, '$1')).substr(-4);
                }, 
                // set type, either numeric or text 
                type: 'text'
            }); 

Это прекрасно работает, пока я не сталкиваюсь с делом с 2 цифрами, которое затем оценивается больше, чем 3 цифры, и я не понимаю, почему ... «X-458/09 P» сортируется меньше, чем «X-48/09». Я попробую отладку, чтобы увидеть, что на самом деле происходит.

РЕДАКТИРОВАТЬ 2: также попробовал второй ответ:

jQuery.tablesorter.addParser({ 
                // set a unique id 
                id: 'case', 
                is: function(s) { 
                    return false; 
                }, 
                format: function(s) { 
                    var m = s.match(/X\-(\d+)\/(\d{2}).*$/);
                    var affaire = m[1];
                    var year = m[2];
                    return year + '000' + affaire;
                }, 
                // set type, either numeric or text 
                type: 'text'
            }); 

Результат, похоже, такой же, как и первый ... Я действительно не могу понять, почему это отстой. Почему TableSorter считает, что 488 000 10 меньше, чем 49 000 10?!

Ответы [ 3 ]

1 голос
/ 27 декабря 2010

Я думаю, вы можете использовать:

$.tablesorter.addParser({ 
    // set a unique id 
    id: 'case', 
    is: function(s) { 
        // return false so this parser is not auto detected 
        return false; 
    }, 
    format: function(s) { 
        // format your data for normalization 
        return s.replace(/^X-\d{1,4}\/(\d{2}).*$/, '$1') + ('000' + s.replace(/^X-(\d{1,4})\/\d{2}.*$/, '$1')).slice(-4);
    }, 
    // set type, either numeric or text 
    type: 'text'
}); 

EDIT:

Может быть, вы уже пробовали что-то подобное с type: 'numeric'; Я не уверен, но это может не сработать, потому что parseInt('09') === 0.

РЕДАКТИРОВАТЬ 2:

Изменено с учетом сортировки по году, а затем по номеру дела.

0 голосов
/ 27 декабря 2010

После нескольких попыток эта вещь, кажется, работает отлично:

jQuery.tablesorter.addParser({ 
                // set a unique id 
                id: 'case', 
                is: function(s) { 
                    return false; 
                }, 
                format: function(s) { 
                    var m = s.match(/X\-(\d+)\/(\d{2}).*$/);
                    var caseVar = '000' + m[1];
                    var size = caseVar.length;
                    caseVar= caseVar.substr(size-4, 4);
                    var year = m[2];
                    return jQuery.tablesorter.formatFloat(year + caseVar);
                }, 
                // set type, either numeric or text 
                type: 'numeric'
            }); 

Я провел некоторое исследование, и оказалось, что функция substr с отрицательным значением работает не во всех браузерах (я использую IE, потому что мое приложение должно быть IE-совместимым). Я думаю, что это причина моих предыдущих проблем, и поэтому решение Spiny не сработало для меня.

В любом случае спасибо всем вам за вашу драгоценную помощь!

0 голосов
/ 27 декабря 2010

Вы можете использовать регулярное выражение, чтобы получить 2 значения, которые вы ищете, например:

var columnVal = "X-123/08";
var m = columnVal.match(/X\-(\d+)\/(\d{2})$/);
var case = m[1];
var year = m[2];
...