插件开发排序
数据表已经内置对表格中显示的最常见数据类型排序的支持,但是有些时候你可能会发现你的数据并不是按照你预期的排序。一个选择是使用正交数据,以便数据表掌握的用于排序的数据(例如日期可能表示为整数时间戳,而不是格式化的字符串)。另一个选择是使用排序插件。
排序插件为数据表提供了能够对任意数据类型进行排序所需的代码。例如,你可能会使用带有后缀运算符的文件大小(MB、KB等)或枚举选项,这些选项需要以特定方式排序。
数据表对数据的特定列使用什么排序函数是通过使用columns.type
选项定义的。这在默认情况下会自动检测(类型检测插件也可以编写),但是你可以手动指定数据类型以使用你的插件。
插件通过将排序函数附加到DataTable.ext.type.order
对象来定义。可以指定三个函数
{type}-pre
- 预格式化方法。用于将格式化后的数据转换为可排序数据{type}-asc
- 升序排序方法{type}-desc
- 降序排序方法
预格式化
通常,你只需要定义一个-pre
方法。这个函数在排序实际发生之前对每个要排序的数据点执行,允许将数据格式化为可使用 Javascript 内置的 Array.prototype.sort()
进行排序的内容。它接受一个参数(数据),并且返回值应该是格式化后的数据。
例如,考虑以下内容
DataTable.ext.type.order['file-size-pre'] = function ( data ) {
var units = data.replace( /[\d\.]/g, '' ).toLowerCase();
var multiplier = 1;
if ( units === 'kb' ) {
multiplier = 1000;
}
else if ( units === 'mb' ) {
multiplier = 1000000;
}
else if ( units === 'gb' ) {
multiplier = 1000000000;
}
return parseFloat( data ) * multiplier;
};
通过将columns.type
选项设置为file-size
,数据如“11GB,200KB 等”现在将得到正确的排序。
自定义升序/降序方法
如果你希望为升序和降序函数提供自定义排序方法,它们采用的形式与数组比较函数完全相同,用于 Array.prototype.sort()
。
请注意,在 DataTables 1.10 中预格式化程序不能与自定义的-asc
和-desc
方法一起使用——要使用自定义排序函数,不能应用预格式化程序。此限制将在 DataTables 的下一个主要版本中解决。
例如,你可能拥有
function format ( a ) {
var units = data.replace( /[\d\.]/g, '' ).toLowerCase();
var multiplier = 1;
if ( units === 'kb' ) {
multiplier = 1000;
}
else if ( units === 'mb' ) {
multiplier = 1000000;
}
else if ( units === 'gb' ) {
multiplier = 1000000000;
}
return parseFloat( data ) * multiplier;
}
$.extend( DataTable.ext.type.order, {
"file-size-asc": function ( a, b ) {
a = format( a );
b = format( b );
return ((a < b) ? -1 : ((a > b) ? 1 : 0));
},
"file-size-desc": function ( a, b ) {
a = format( a );
b = format( b );
return ((a < b) ? 1 : ((a > b) ? -1 : 0));
}
} );
现有插件
您可能会发现在其他 DataTables 用户已经创建与您需求相对应的增益件。增益件发布在此网站上并且也可以在 DataTables CDN 上获得。
发布您的增益件
如果您为 DataTables 创建了一个排序增益件,请让我们知道!其他人很可能会受益于您的增益件,并且我(和整个社区)将非常感谢您的贡献。