jQuery dataTables 排序不正确(带有笔划的拉丁字母 D)

Posted

技术标签:

【中文标题】jQuery dataTables 排序不正确(带有笔划的拉丁字母 D)【英文标题】:jQuery dataTables sorting is incorrect (latin letter D with stroke) 【发布时间】:2017-08-04 10:23:49 【问题描述】:

我有一张表,需要按一列升序排序,但“Đ Garrett Winters”在“Tiger Nixon”之后

列名中的正确顺序是“Ashton Cox”、“Cedric Kelly”、“Đ Garett Winters”、“Tiger Nixon”...

Example

jQuery.extend( jQuery.fn.dataTableExt.oSort, 
    "non-empty-string-asc": function (str1, str2) 
        if(str1 == "")
            return 1;
        if(str2 == "")
            return -1;
        return ((str1 < str2) ? -1 : ((str1 > str2) ? 1 : 0));
    ,
 
    "non-empty-string-desc": function (str1, str2) 
        if(str1 == "")
            return 1;
        if(str2 == "")
            return -1;
        return ((str1 < str2) ? 1 : ((str1 > str2) ? -1 : 0));
    
 );


$('#example').dataTable(
    columnDefs: [
       type: 'non-empty-string', targets: 0 // define 'name' column as non-empty-string type
    ]
);
<table id="example" class="display" cellspacing="0" >
    <thead>
        <tr>
            <th>Name</th>
            <th>Position</th>
            <th>Office</th>
            <th>Age</th>
            <th>Start date</th>
            <th>Salary</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Tiger Nixon</td>
            <td>System Architect</td>
            <td>Edinburgh</td>
            <td>61</td>
            <td>2011/04/25</td>
            <td>$320,800</td>
        </tr>
        <tr>
            <td>Đ Garrett Winters</td>
            <td>Accountant</td>
            <td>Tokyo</td>
            <td>63</td>
            <td>2011/07/25</td>
            <td>$170,750</td>
        </tr>
        <tr>
            <td>Ashton Cox</td>
            <td>Junior Technical Author</td>
            <td>San Francisco</td>
            <td>66</td>
            <td>2009/01/12</td>
            <td>$86,000</td>
        </tr>
        <tr>
            <td>Cedric Kelly</td>
            <td>Senior javascript Developer</td>
            <td>Edinburgh</td>
            <td>22</td>
            <td>2012/03/29</td>
            <td>$433,060</td>
        </tr>
        
        <tr>
            <td></td>
            <td>Junior Technical Author</td>
            <td>San Francisco</td>
            <td>66</td>
            <td>2009/01/12</td>
            <td>$86,000</td>
        </tr>
        <tr>
            <td></td>
            <td>Senior Javascript Developer</td>
            <td>Edinburgh</td>
            <td>22</td>
            <td>2012/03/29</td>
            <td>$433,060</td>
        </tr>
        
    </tbody>
</table>

【问题讨论】:

【参考方案1】:

试试谷歌“javascript diacritics”。它是“添加到字母的字形”的术语。这意味着在ăşţĐđ (latin letter D with stroke) 等许多语言中发现的所有重音或特殊字符。

显然,这些字符的 unicode 值高于其“正常”对应部分,因此排序不同。基本上你想像这样“规范化”字符,所以你可以从人类的角度以理智的方式对字符串进行排序。作为一个我们使用重音字母的国家的公民,这是一个非常普遍的问题。

幸运的是,有很多编写良好的库/函数可以做到这一点。

查看这个出色的实现 -> http://web.archive.org/web/20120918093154/http://lehelk.com/2011/05/06/script-to-remove-diacritics

您可以直接使用它,只需使用prepare 方法扩展您的插件:

jQuery.extend( jQuery.fn.dataTableExt.oSort, 
    "non-empty-string-pre": function(str) 
        return removeDiacritics(str)
    ,
    "non-empty-string-asc": function (str1, str2) 
      ...         
    ,
    "non-empty-string-desc": function (str1, str2) 
      ...
    
 );

就是这样!查看更新的工作小提琴 -> https://jsfiddle.net/xshh5np8/56/

【讨论】:

非常感谢,我已经修好了 :)【参考方案2】:

'D'和'Đ'(D with Stroke)在计算机中的表示(和处理)不同,如果您希望它按字母顺序排序,我建议将Đ更改为通常的'D' .

另一种解决方案是在对表格进行排序时,通过字符串比较以相同的方式处理“D”和“Đ”。

(我很抱歉,但我不能 100% 理解你在 jQuery 中试图做什么)

【讨论】:

以上是关于jQuery dataTables 排序不正确(带有笔划的拉丁字母 D)的主要内容,如果未能解决你的问题,请参考以下文章

JQuery Datatable 日期列未正确排序

jQuery Datatables Ultimate 日期/时间排序插件

Jquery Datatables 列渲染和排序

jQuery 插件 (DataTables) 仅在页面刷新时正确加载

在 jQuery DataTables 中使用锚标记对列进行排序

jQuery dataTable 不显示排序图标