JQuery Tablesorter Парсер для высоты и дроби - PullRequest
1 голос
/ 26 февраля 2012

Я работал с Tablesorter последние несколько дней, но не смог найти ничего, что могло бы помочь с парсером для высоты (5'11 ", 6'2" и т. Д.) Или дробей (10 3/4, 10 5 / 8 и т. Д.) Страница, над которой я работаю, находится здесь: http://tinyurl.com/89ewthl

Для большинства столбцов это нормально, но у меня возникают проблемы со столбцами «Прыжок в длину», «Рука» и «Рука». Скрипт не распознает, что 10'11 "больше / длиннее 10'4"; скорее он группирует его прямо над 10'1 ", что имеет смысл. Я видел один пост, в котором предлагалось вводить результаты в дюймах (например, 10'11" = 131, 10'1 "= 121, 10'4" = 124) и использовать парсер для преобразования его в формат X'Y ", но я не смог заставить его работать.

Что касается дробей, я использую в порядке возрастания от 1/8 до 7/8:

⅛ ¼ ⅜ ½ ⅝ ¾ and ⅞

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

Я не очень хорошо разбираюсь в Javascript, поэтому написание парсеров было бы проблематично для меня. Я был бы очень признателен за любую помощь, которая предоставляется!

Ответы [ 2 ]

1 голос
/ 18 июня 2012

Я просто наткнулся на это, ища что-то еще, но я подумал, что добавлю свое решение проблемы сортировки по высоте на тот случай, если это кому-нибудь понадобится.Я использовал это, чтобы отсортировать высоты футболистов средней школы для http://blitz.fresnobeehive.com

1 голос
/ 29 февраля 2012

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

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

Вот проверенный HTML

<table class="tablesorter">
  <thead>
    <tr>
      <th>Distance</th>
    </tr>
  </thead>
  <tbody>

    <tr><td>3'</td></tr>
    <tr><td>11"</td></tr>
    <tr><td>5'</td></tr>
    <tr><td>3"</td></tr>
    <tr><td>&frac12;"</td></tr>

    <tr><td>5' 11"</td></tr>
    <tr><td>10' 11"</td></tr>
    <tr><td>10' 1"</td></tr>
    <tr><td>10' 4"</td></tr>
    <tr><td>5' 9"</td></tr>

    <tr><td>5' 3/4"</td></tr>
    <tr><td>5' 5/8"</td></tr>
    <tr><td>5' 3 1/2"</td></tr>

    <tr><td>10' 3&#8539;"</td></tr>

    <tr><td>10' 2&#8540;"</td></tr>
    <tr><td>10' 3&#8541;"</td></tr>
    <tr><td>10' 2&#8542;"</td></tr>
    <tr><td>5' 3&frac14;"</td></tr>
    <tr><td>5    '   2   &frac12;        "</td></tr>
    <tr><td>10' 2&frac34;"</td></tr>

    <tr><td>5' 2 &frac12;"</td></tr>
    <tr><td>5' 2.5"</td></tr>

    <tr><td>5' 2 1/2"</td></tr>

    <tr><td> 10  ' 1   "</td></tr>

  </tbody>
</table>

и код инициализации анализатора и сортировщика таблиц:

$(function(){

    $.tablesorter.addParser({
        // set a unique id
        id: 'distance',
        is: function(s) {
            // return false so this parser is not auto detected
            return false;
        },
        format: function(s) {
            var d, f, i = 0, t, p = 0;
            // look for feet symbol = '
            d = (/^(\s+)?\d+(\s+)?\'/.test(s)) ? s.split("'") : [0,s];
            // *** feet ***
            f = d[0];

            // *** inches ***
            if (typeof(d[1]) !== 'undefined') {
                // trim outside spaces and remove the inches symbol = "
                i = $.trim(d[1].replace(/\"/,''));

                // look for a space in the first part of the inches: "10 3/4" and save the "10"
                if (/\s/.test(i)) {
                    p = parseFloat(i.split(' ')[0]);
                    // remove stuff to the left of the space
                    i = $.trim(i.substring(i.indexOf(' '), i.length));
                }

                // look for a "/" to calculate fractions
                if (/\//.test(i)) {
                    t = i.split('/');
                    // turn 3/4 into .75; make sure we don't divide by zero
                    i = p + parseInt(t[0], 10) / parseInt(t[1] || 1, 10);
                // look for non-words (anything but the below symbols will be replaced with "undefined")
                } else if (/\W/.test(i)) {
                    i = p + i.replace(/\W/g, function(m){
                        return {
                            '.' : '.',    // leave decimal, just in case
                            '⅛' : '.125', // 1/8
                            '⅜' : '.375', // 3/8
                            '⅝' : '.625', // 5/8
                            '⅞' : '.875', // 7/8
                            '¼' : '.25',  // 1/4
                            '½' : '.5',   // 1/2
                            '¾' : '.75'   // 3/4
                        }[m];
                    });
                }
            }
            // format your data for normalization
            return parseFloat(f) + (parseFloat(i)/12 || 0);
        },
        // set type, either numeric or text
        type: 'numeric'
    });

    $('table').tablesorter({
        headers : { 0: { sorter: 'distance' }},
        widgets: ['zebra']
    });
});​
...