DataTables 对混合数字和文本列进行排序
DataTables sort mixed numeric and text column
我正在尝试构建一个数据表 sortable table,其中包含一列数字,但该列还包含文本 NA
以表示缺失数据。我想知道如何编写自定义排序函数,以便在对列进行排序时,NA
出现在数字之后,而不是在列出值从大到小之前。代码笔在这里:https://codepen.io/mayagans/pen/VwKJeMo
$('#my-table').DataTable({
"autoWidth": false,
"order": []
});
td {
padding: 0 20px;
}
table {
margin: 10px 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
<table id="my-table">
<thead>
<th>Nr. </th>
<th>Name</th>
</thead>
<tr>
<td>1</td>
<td>Carl</td>
</tr>
<tr>
<td>2</td>
<td>Alan</td>
</tr>
<tr>
<td>3</td>
<td>Bobby</td>
</tr>
<tr>
<td>NA</td>
<td>Maya</td>
</tr>
<tr>
<td>NA</td>
<td>Jordan</td>
</tr>
</tr>
<tr>
<td>-</td>
<td>Monica</td>
</tr>
</table>
期望的输出:
从大到小排序时:
<table id="my-table">
<thead>
<th>Nr. </th>
<th>Name</th>
</thead>
<tr>
<td>3</td>
<td>Bobby</td>
</tr>
<tr>
<td>2</td>
<td>Alan</td>
</tr>
<tr>
<td>1</td>
<td>Carl</td>
</tr>
<tr>
<td>NA</td>
<td>Maya</td>
</tr>
<tr>
<td>NA</td>
<td>Jordan</td>
</tr>
</tr>
<tr>
<td>-</td>
<td>Monica</td>
</tr>
</table>
感谢任何帮助!!
您可以利用 orthogonal data,它允许您存储自定义排序值,该值不同于显示值:
$('#my-table').DataTable( {
columnDefs: [ {
targets: [ 0 ],
render: function ( data, type, row ) {
if ( type === 'sort' ) {
var sortValue = data;
switch( data ) {
case '-':
sortValue = -999998;
break;
case 'NA':
sortValue = -999999
break;
default: // already set, in this case
}
return sortValue;
} else {
return data;
}
}
} ]
} );
这假设您的数值永远不会低于 switch
语句中使用的两个值。如果您的整体数据与此不兼容,您可以根据需要进行调整。
我的样本:
我正在尝试构建一个数据表 sortable table,其中包含一列数字,但该列还包含文本 NA
以表示缺失数据。我想知道如何编写自定义排序函数,以便在对列进行排序时,NA
出现在数字之后,而不是在列出值从大到小之前。代码笔在这里:https://codepen.io/mayagans/pen/VwKJeMo
$('#my-table').DataTable({
"autoWidth": false,
"order": []
});
td {
padding: 0 20px;
}
table {
margin: 10px 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
<table id="my-table">
<thead>
<th>Nr. </th>
<th>Name</th>
</thead>
<tr>
<td>1</td>
<td>Carl</td>
</tr>
<tr>
<td>2</td>
<td>Alan</td>
</tr>
<tr>
<td>3</td>
<td>Bobby</td>
</tr>
<tr>
<td>NA</td>
<td>Maya</td>
</tr>
<tr>
<td>NA</td>
<td>Jordan</td>
</tr>
</tr>
<tr>
<td>-</td>
<td>Monica</td>
</tr>
</table>
期望的输出:
从大到小排序时:
<table id="my-table">
<thead>
<th>Nr. </th>
<th>Name</th>
</thead>
<tr>
<td>3</td>
<td>Bobby</td>
</tr>
<tr>
<td>2</td>
<td>Alan</td>
</tr>
<tr>
<td>1</td>
<td>Carl</td>
</tr>
<tr>
<td>NA</td>
<td>Maya</td>
</tr>
<tr>
<td>NA</td>
<td>Jordan</td>
</tr>
</tr>
<tr>
<td>-</td>
<td>Monica</td>
</tr>
</table>
感谢任何帮助!!
您可以利用 orthogonal data,它允许您存储自定义排序值,该值不同于显示值:
$('#my-table').DataTable( {
columnDefs: [ {
targets: [ 0 ],
render: function ( data, type, row ) {
if ( type === 'sort' ) {
var sortValue = data;
switch( data ) {
case '-':
sortValue = -999998;
break;
case 'NA':
sortValue = -999999
break;
default: // already set, in this case
}
return sortValue;
} else {
return data;
}
}
} ]
} );
这假设您的数值永远不会低于 switch
语句中使用的两个值。如果您的整体数据与此不兼容,您可以根据需要进行调整。
我的样本: