如何在 desc 中使用一列的多列排序?

Posted

技术标签:

【中文标题】如何在 desc 中使用一列的多列排序?【英文标题】:How I use multi column ordering with one column in desc? 【发布时间】:2020-08-10 21:34:21 【问题描述】:

这是我的数据表:

NAME   SORT
Adam
Ali    101
David  102
Laura
Will

我尝试按name 列和sort 列对我的表进行排序。

我要找的结果是:

NAME   SORT
David  102  
Ali    101  
Adam
Laura
Will

这意味着,所有具有排序号的内容都应按列sort 排序,其他所有内容都应按name 排序。

这是我的方法:

var table = $('.datatable').DataTable(
"order": [[ 0, "asc" ]],
"columnDefs": [
  
        "targets": [ 0 ],
        "orderData": [ 0, 1 ]
      ,
],
...

但它不起作用。列仅按name 排序。 如果我将代码更改为:

  var table = $('.datatable').DataTable(
    "order": [[ 0, "asc" ]],
    "columnDefs": [
      
            "targets": [ 0 ],
            "orderData": [ 1, 0 ]
          ,
    ],
    ...

现在正在考虑对两列进行排序,但是第二列的排序方向错误:

NAME   SORT
Adam
Laura
Will
Ali    101  
David  102  

【问题讨论】:

【参考方案1】:

更新:我在最初的帖子中遗漏了一项。我现在已将演示从 "orderData": [ 2 ] 更正为 "orderData": [ 2, 0 ]

两种选择:

建议的方法

演示表:

$(document).ready(function () 

  var data = [
     "name": "Adam", "sort": null , 
     "name": "Ali", "sort": 101 , 
     "name": "David", "sort": 102 , 
     "name": "Will", "sort": null ,
     "name": "Laura", "sort": null  
  ];

  $("#myTable").DataTable(
    data: data,
    columns: [
       "data": "name", "orderData": [ 2, 0 ] ,
       "data": "sort" ,
       "data": null, "visible" : false,
          "render": function ( data, type, row, meta ) 
            return (!row.sort ? 999 : row.sort * -1);
           
        
    ],
    order: [ [ 1, "desc" ], [ 0, "asc" ] ]
  );

);

我们引入了一个新的(隐藏的)列,其中包含以下数据 - 仅在此屏幕截图中未隐藏:

当您对第 1 列(后跟第 1 列 - 索引 0 中的数据)进行排序时,将使用此第 3 列的数据:

 "data": "name", "orderData": [ 2, 0 ] ,

在这种情况下,“2”指的是第 3 列 - 列索引从 0 开始。

另类

这可能不是您想要的,但我提到它是因为它是一个更简单的解决方案 - 尽管需要用户提供更多知识。

演示表:

$(document).ready(function () 

  var data = [
     "name": "Adam", "sort": null , 
     "name": "Ali", "sort": 101 , 
     "name": "David", "sort": 102 , 
     "name": "Will", "sort": null ,
     "name": "Laura", "sort": null 
  ];

  $("#myTable").DataTable(
    data: data,
    columns: [
       "data": "name" ,
       "data": "sort" 
    ],
    order: [ [ 1, "desc" ], [ 0, "asc" ] ]
  );

);

此行设置初始排序顺序:

order: [ [ 1, "desc" ], [ 0, "asc" ] ]

这会在表格首次显示时为您提供以下信息:

要返回到这个起点,用户必须执行以下操作:

1) 单击第 2 列的排序箭头,直到该列正确排序。

2) 按住 SHIFT 键的同时单击第 1 列,直到该列正确排序。

注意事项

替代方案更灵活,但需要用户了解用于多列排序的 SHIFT 键。

建议的方法将自动完成这项工作 - 但用户将无法使用此选项对用户名进行“纯”字母排序。如果他们不知道为什么数据按原样排序,这甚至可能会令人困惑。

【讨论】:

以上是关于如何在 desc 中使用一列的多列排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Fluent API 通过 ASC/DESC 排序在多列上添加索引?

对 WPF 数据网格中的多列进行排序

如何使用另一列的值从一列创建多列?

EXCEL中如何把一列数据变为多列?

DataGridView 添加多列

JavaFX,如何冻结TableView中某些列的位置