Jquery 如何使用不同的数据进行排序

Jquery 如何使用不同的数据进行排序,jquery,datatables,Jquery,Datatables,我使用jQuery DataTables 1.10.4来呈现一个表,每个表的行都有关于文件的信息 此表中的一列显示了文件大小。渲染时,我希望该列读取NNN KB(带有“KB”后缀)。我还希望用户能够对文件大小列进行数字排序 但是,虽然我的文件数据数组中只有数字表示文件的大小(以字节为单位),但排序功能似乎使用字符串的渲染值,我得到的是字符串排序,而不是数字排序 是否有一种简单的方法来声明列的类型,以便排序为数字?例如,对于排序,我希望jquerydatatables使用files数组中的值 如果

我使用jQuery DataTables 1.10.4来呈现一个表,每个表的行都有关于文件的信息

此表中的一列显示了文件大小。渲染时,我希望该列读取
NNN KB
(带有“KB”后缀)。我还希望用户能够对文件大小列进行数字排序

但是,虽然我的
文件
数据数组中只有数字表示文件的大小(以字节为单位),但排序功能似乎使用字符串的渲染值,我得到的是字符串排序,而不是数字排序

是否有一种简单的方法来声明列的类型,以便排序为数字?例如,对于排序,我希望jquerydatatables使用files数组中的值

如果不能用
columnDefs
规范声明,那么最简单的排序插件或函数是什么

这是我到目前为止所拥有的

var files = {['name','dir',10240], .... }

var sortable_size = function(data, type, full, meta) {
    return Math.floor(full[2]/1024) + " KB";
};

$('#files').dataTable({
   data: files,
   pagingType: 'simple',
   columnDefs: [
      { targets:0, render:clickable_message },
      { targets:3, render:clickable_attachment },
      { targets:2, render:sortable_size, width:'100px', type:'num' }
   ], 
   // no width for col 0 here because it causes linewrap in data 
   // and size fields (attachment name can be fairly wide as well)
   order:[[1, 'asc']], // col 1 (date), ascending
   fnInitComplete: function() { 
      $('#attachments').fadeIn(); 
   }
});

用我自己的排序类型解决了它:

 $.fn.dataTableExt.oSort['sort-kb-asc']  = function(x,y) {
        console.log('x =' + x + ' y = ' + y);
        x = parseInt(x.substring(0, x.indexOf(' KB')));
        y = parseInt(y.substring(0, y.indexOf(' KB')));
        console.log('x =' + x + ' y = ' + y);
        return ((x < y) ? -1 : ((x > y) ?  1 : 0));
    };

    $.fn.dataTableExt.oSort['sort-kb-desc']  = function(x,y) { return -1 * $.fn.dataTableExt.oSort['sort-kb-asc'](x,y); }

解决方案很简单,当显示数据时(
type===“display”
),返回格式化字符串,否则返回要排序的数据。从:

请求的类型调用数据-这将是
'filter'
'display'
'type'
'sort'

有关更多信息,请参阅


如果文件大小不是以字节为单位存储的,那么解决方案就是使用。

强制将要排序的字符串转换为整数怎么样?使用
parseInt()。或者,你可以使用自然排序:谢谢,特里!这解决了我的问题。我编写了自己的排序函数,因为我不想依赖外部插件。干杯谢谢不知道类型=='display'。
{targets:2,render:sortable_size,width:'100px',type:'sort-kb',className: "dt-right"},
var sortable_size = function(data, type, full, meta) {
    if(type === 'display'){
       return Math.floor(full[2]/1024) + " KB";
    } esle {
       return data;
    }
};