DataTables多列排序问题:保留日期降序同时排序数值列
DataTables多列排序问题解决:保持日期降序+薪资空值后置
问题分析
你当前的配置[[2, 'desc'],[3, 'desc']]试图实现日期降序优先,薪资降序次之,但存在几个关键问题:
- 薪资列是带货币符号的字符串,DataTables默认字符串排序逻辑不符合数值排序需求;
- 空值的默认排序优先级不符合预期,且多列排序逻辑未保证日期的绝对主导地位;
- 配置项拼写错误:
serverSider应为serverSide(若启用服务端模式)。
解决方案
客户端排序场景(示例数据为客户端加载)
通过自定义薪资列的排序规则,确保日期列始终是第一排序维度,薪资列仅在日期相同时生效,且空值排在非空值之后:
$(document).ready(function(){ // 自定义薪资列排序规则:空值后置,非空值按数值降序 $.fn.dataTable.ext.order['salary-null-last-desc'] = function ( settings, col ) { return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) { var text = $(td).text().trim(); // 空值返回极小值,非空值提取纯数值后取反(实现降序) return text === '' ? -Infinity : -parseFloat(text.replace(/[^0-9.]/g, '')); } ); }; var table = $('#servicios').DataTable({ processing: true, // serverSide: true, // 修正拼写,不需要服务端则注释/删除 order: [[ 2, 'desc' ],[ 3, 'salary-null-last-desc' ]], pageLength: 50, lengthMenu: [[5,10,50,-1], [5,10,50,"All"]], columnDefs: [ { targets: 3, orderDataType: 'salary-null-last-desc' } ] }); });
服务端排序场景
若启用serverSide: true,需在后端处理排序逻辑:
- 优先按
Date字段降序排序; - 对相同日期的记录,按
salary字段排序:将空值/空字符串视为最小值,排在非空值之后,非空值提取纯数值后降序排序。
效果说明
- 所有记录首先按日期从新到旧排列;
- 同一日期的记录中,有薪资的行排在无薪资的行前面,且薪资高的行在前;
- 日期的降序顺序不会被薪资排序打乱。
内容的提问来源于stack exchange,提问作者JL DIAZ
相关产品推荐
相关产品推荐

