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