jQuery dataTables自定义排序不适用于中文数字

时间:2015-07-20 04:07:17

标签: javascript jquery sorting datatable datatables

我已经为我的问题创建了jsFiddle

$.extend($.fn.dataTableExt.oSort, {
    "mysort-pre":  function (s)    { return s.replace(/(<([^>]+)>)/g, ''); },
    "mysort-asc":  function (a, b) { return a.localeCompare(b); },
    "mysort-desc": function (a, b) { return b.localeCompare(a); }
});
$(function(){
    $('table').dataTable({
        order: [[ 0, "asc" ]],
        columnDefs: [ { type: "mysort", targets: 0 } ]
    });
});

简而言之,中文 / / 分别表示1 / 2 / 3

默认情况下,它会对&gt;进行排序&gt; 所以我决定写自己的排序。

数据字段中可能(不)有一些HTML标记,因此我使用正则表达式在'-pre'函数中删除它们。

对于'-asc''-desc'函数,我直接使用localCompare(),它应该排序&gt; &gt;

但与我的想法相比,结果并不相同。

1 个答案:

答案 0 :(得分:0)

<强>原因

以下是DataTables源代码的摘录:

  

每个订购选项可以通过添加到
的三个属性来描述   这个对象:

     
      
  • {type}-pre - 预格式化功能
  •   
  • {type}-asc - 升序功能
  •   
  • {type}-desc - 降序功能
  •   
     

这三个可以一起使用,仅{type}-pre或仅使用   {type}-asc{type}-desc在一起。通常建议这样做   仅使用{type}-pre,因为这提供了最佳   虽然提供了其他的,但在速度方面的实施   与现有的Javascript排序功能兼容。

这意味着如果{type}-asc存在,则不会调用{type}-desc / {type}-pre

此外,还有Chinese (string)排序插件已经可用,但它不会删除HTML标签。

<强>解

所以从技术上讲,你的排序插件应该如下所示编写,以便排序和删除HTML标签。

$.extend($.fn.dataTableExt.oSort, {
    "mysort-asc":  function (a, b) { 
        a = a.replace(/<[^>]+>/g, '');
        b = b.replace(/<[^>]+>/g, '');
        return a.localeCompare(b, "zh-CN-u-co-stroke"); 
    },
    "mysort-desc": function (a, b) { 
        a = a.replace(/<[^>]+>/g, '');
        b = b.replace(/<[^>]+>/g, '');       
        return b.localeCompare(a, "zh-CN-u-co-stroke"); 
    }
});

<强>样本

请参阅this jsFiddle进行演示。

备注

最初localCompare产生意外结果

  • ('三').localeCompare('二')返回-1,这意味着'三'&lt; '二'

当我将其更改为('三').localeCompare('二', "zh-CN-u-co-stroke")时,会产生正确的结果。