2012-04-28 2 views
0

Я пытаюсь сортировать числа, как эти:пользовательскую сортировку экспоненциальное с помощью JQuery плагин DataTables

< 1Е-8

0,000027

0,000061

0,0018

0,0094

< 8.64e-12

0,049

'<' означает, что истинное значение меньше, чем количество данного.

Вот мой «функцию спуска», который у меня есть очень высокое доверие:

$.fn.dataTableExt.oSort['scientific-desc'] = function(a,b) { 
        var x = a.replace(/^[<>]/g,""); 
        var y = b.replace(/^[<>]/g,""); 
        x = parseFloat(x); 
        y = parseFloat(y); 

        return ((x < y) ? 1 : ((x > y) ? -1 : 0)); 
} 

И я определил функцию «всплытия» аналогично:

$.fn.dataTableExt.oSort['scientific-asc'] = function(a,b) { 
        var x = a.replace(/^[<>]/g,""); 
        var y = b.replace(/^[<>]/g,""); 
        x = parseFloat(x); 
        y = parseFloat(y); 

        return ((x < y) ? -1 : ((x > y) ? 1 : 0)); 
} 

Я играл с почти все в коде инициализации и с указанными выше функциями сортировки, но ничто, похоже, не может правильно сортировать числа в таблице. Цифры < 1E-8 всегда имеют тенденцию оставаться вместе, а также те, которые имеют нижний регистр «e».

Код для инициализации dataTable выглядит следующим образом. Это, вероятно, стоит отметить, что это код называется внутри вызова AJAX:

$.get('xyz.json', 
    function(data) { 
     // deal with json data 
     // get it ready for dataTable 
     // ... 

    $('.table').dataTable({ 
        "sScrollY": "200px", 
        "aoColumns": [ 
         null, 
         null, 
         {"bSortable": true, "sType": "scientific"}, 
         {"bSortable": false} 
        ], 
        "aaSorting": [ [2,'asc'] ], 
        "bPaginate": false, 
        "bFilter": false, 
        "iDisplayLength": 5, 
        "bRetrieve": true, 
        "bDestroy": true 
    }); 
}); 

ответ

0

Служит мне для получения «высокой уверенности» в моей функции сортировки. Быстро распечатав а и б на консоли показали, что функции сортировки становились передается HTML сущности

&lt; 

и не «<».

Благодаря другому stackoverflow thread:

varTitle = $('<div />').html("Chris&apos; corner").text(); 
0

В вашем примере, цифры со знаками «<» являются рядом друг с другом в упорядоченном списке.

var A= ['<1E-8', 0.000027, 0.000061, 0.0018, 0.0094, '<8.64e-12', 0.049]; 

A.sort(function(a, b){ 
    var a1= String(a).replace(/^(<|>)/, ''), 
    b1= String(b).replace(/^(<|>)/, ''); 
    return a1-b1; 
}).join('\n'); 

<8.64e-12 
<1E-8 
0.000027 
0.000061 
0.0018 
0.0094 
0.049 

//To have a decending sort, just reverse it- 

A.sort(function(a, b){ 
    var a1= String(a).replace(/^(<|>)/, ''), 
    b1= String(b).replace(/^(<|>)/, ''); 
    return a1-b1; 
}).reverse().join('\n'); 


0.049 
0.0094 
0.0018 
0.000061 
0.000027 
<1E-8 
<8.64e-12 
+0

Вы говорите, что для регулярного выражения требуется '|'? Я не думаю, что это важно, пишите ли вы [<>] или^(<|>). Функции сортировки, похоже, работают.Меня смущает то, что плагин dataTables не работает, когда я пытаюсь заставить его использовать эти функции сортировки. – gideonite

0

Другой способ сделать пользовательскую сортировку в DataTables, чтобы включить что-то скрытое в ячейке таблицы:

<tr> 
    <td>Large<input type="hidden" value="3"></td> 
</tr> 
<tr> 
    <td>Small<input type="hidden" value="1"></td> 
</tr> 
<tr> 
    <td>Medium<input type="hidden" value="2"></td> 
</tr> 

, а затем сортировать по скрытому значению вместо отображаемое значение:

// Tell DataTables to use this sort type always 
$.fn.dataTableExt.aTypes.unshift(
    function() { 
     return 'custom-sort'; 
    } 
); 


$.extend($.fn.dataTableExt.oSort, { 
    // The selector 
    "custom-sort-pre": function(a) { 
     var sortValue = $(a).val(); 
     if (sortValue === undefined) { 
      return a; 
     } 

     if (sortValue == 'NaN') { 
      return NaN; 
     } 

     var floatValue = parseFloat(sortValue); 
     if (isNaN(floatValue)) { 
      return sortValue; 
     } 
     return floatValue; 
    }, 

    // Asc sorting 
    "custom-sort-asc": function (a, b) { 
     if (isNaN(a) && !isNaN(b)) return 1; 
     if (!isNaN(a) && isNaN(b)) return -1; 
     if (isNaN(a) && isNaN(b)) return 0; 

     if (a > b) return 1; 
     if (a < b) return -1; 
     return 0; 
    }, 

    // Desc sorting 
    "custom-sort-desc": function(a, b) { 
     return $.fn.dataTableExt.oSort['custom-sort-asc'](a, b) * -1; 
    } 
}); 

Этот пример будет ork на обеих строках и числах.

Смежные вопросы