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

时间:2015-07-14 23:16:30

标签: jquery datatables

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

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

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

是否有一种简单的方法可以声明列的类型,使得排序是数字的?即为了排序,我希望jQuery DataTables使用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(); 
   }
});

2 个答案:

答案 0 :(得分:2)

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

  

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

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

有关详细信息,请参阅columns.render

如果您没有以字节为单位存储文件大小,解决方案是使用File size sorting plug-in

答案 1 :(得分:0)

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

 $.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); }

并在我的columnDefs调用中:

{targets:2,render:sortable_size,width:'100px',type:'sort-kb',className: "dt-right"},