插件开发排序

数据表已经内置对表格中显示的最常见数据类型排序的支持,但是有些时候你可能会发现你的数据并不是按照你预期的排序。一个选择是使用正交数据,以便数据表掌握的用于排序的数据(例如日期可能表示为整数时间戳,而不是格式化的字符串)。另一个选择是使用排序插件。

排序插件为数据表提供了能够对任意数据类型进行排序所需的代码。例如,你可能会使用带有后缀运算符的文件大小(MBKB等)或枚举选项,这些选项需要以特定方式排序。

数据表对数据的特定列使用什么排序函数是通过使用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 创建了一个排序增益件,请让我们知道!其他人很可能会受益于您的增益件,并且我(和整个社区)将非常感谢您的贡献。