我试图理解Datatables
中的自定义排序机制。我想要做的是根据列的值和其他列(包含一个组)的值对列进行排序以进行分组排序。
要做到这一点,我来到了整个插件:https://datatables.net/plug-ins/sorting/
就像一个例子(可能是另一个例子),我看了一下"反..."插入。为了实现它,我补充道:
targets = "_all", type = "anti-the"
到columnDefs
并使用
jQuery.extend( jQuery.fn.dataTableExt.oSort, {
"anti-the-pre": function ( a ) {
console.log("pre");
return a.replace(/^the /i, "");
},
"anti-the-asc": function ( a, b ) {
console.log("asc");
return ((a < b) ? -1 : ((a > b) ? 1 : 0));
},
"anti-the-desc": function ( a, b ) {
console.log("desc");
return ((a < b) ? 1 : ((a > b) ? -1 : 0));
}
} );
计划是调整这三个功能以获得所需的分组排序。
有趣的是&#34; pre&#34;每次单击表标题(并使用表)时,都会打印到控制台。我期待&#34; asc&#34;和&#34; desc&#34;也可以打印(按照交替顺序)但没有打印,为什么?
这是获得所需分组排序结果的正确方法吗?还是我需要定义自己的&#34; orderDataType&#34;达到这个目标?
修改
只是为了让事情更清楚: 我们假设我有一个表格,其中包含关于&#34;部门&#34;的信息/列。和&#34;地板&#34;在排序&#34; floor&#34;我希望按每个部门的楼层排序
排序前:
|部门|地板|
| IT | 2 |
| IT | 1 |
|销售| 1 |
|销售| 2 |
点击标题后(&#34; floor&#34; - &gt; asc)
| IT | 1 |
| IT | 2 |
|销售| 1 |
|销售| 2 |
再次点击(desc)
| IT | 2 |
| IT | 1 |
|销售| 2 |
|销售| 1 |
在我所拥有的数据中,组之间没有混合(这里:部门) - &gt;同一部门的行将彼此相邻
答案 0 :(得分:1)
当您尝试对数据进行分组排序时,我建议您使用数据表&#34;或对数数据&#34;与HTML5 data- * attributes
结合使用正如您可以在此处阅读(Datatables Website - Orthagonal Data - HTML5),使用自定义属性data-order
应该是您的首选武器。
例如:
您希望对department
和floor
进行分组,但只向用户显示department
。此示例应显示所需的输出
(姓氏单元格中的floornumber是可视化正确排序的辅助工具,可以删除)
<table id="myTestTable" class="display">
<thead>
<tr>
<th>Department</th><th>Surname</th>
</tr>
</thead>
<tbody>
<tr>
<td data-order="it 1">IT</td> <td>Daniel (1)</td>
</tr>
<tr>
<td data-order="sales 2">sales</td> <td>Sue (2)</td>
</tr>
<tr>
<td data-order="it 1">IT</td> <td>John (1)</td>
</tr>
<tr>
<td data-order="it 2">IT</td> <td>Mr. Miyagi (2)</td>
</tr>
<tr>
<td data-order="sales 2">sales</td> <td>Mel (2)</td>
</tr>
<tr>
<td data-order="sales 1">sales</td> <td>Marc (1)</td>
</tr>
</tbody>
</table>
<script>
$('#myTestTable').dataTable();
</script>
编辑:
第一个例子中的排序对于10号楼及以上楼层来说是错误的。它将是1,10,2,3,4等等,因为数据表会严格对字符串进行排序。
为了解决这个问题,在datatables网站上有一个名为natural sorting的排序插件。包含此代码并将{ columnDefs: [ { type: 'natural' , targets: 0 } ] }
添加到tabledefinition将使排序更加human
。