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 语句中使用的两个值。如果您的整体数据与此不兼容,您可以根据需要进行调整。

我的样本: