我已经为我的问题创建了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; 一
。
但与我的想法相比,结果并不相同。
答案 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")
时,会产生正确的结果。