Dan*_* V. 13 javascript sorting
我在这里面临着相当大的挑战.我用拼音来区分某些中文"表达".
问题:
我怎么能在Firefox中按拼音排序?
有没有办法在IE 9和10中正确排序?(它们也得到网站的支持)
例:
根据翻译机构的说法,这就是单词的排序顺序.翻译如下:
拉丁字母表中的代词:
String.localeCompare: MDN Docs
根据我的理解,我将提供第二个参数,该String.localeCompare方法"告诉"按BCP 47格式拼音排序的方法应该是zh-CN-u-co-pinyin.
所以完整的代码应如下所示:
var arr = [ "??????", "????", "??????"];
console.dir(arr.sort(function(a, b){
return a.localeCompare(b, [ "zh-CN-u-co-pinyin" ]);
}));
Run Code Online (Sandbox Code Playgroud)
我希望这能按照我在数组中输入的顺序登录控制表达式,但输出不同.
在FX 27上,订单是:3,1,2
在Chrome中33:1,2,3
在IE 11中:1,2,3
注意:
拼音是将汉字的普通话发音转录成拉丁字母的官方语音系统.
这适用于Chrome:
const arr = ["?","?","?","?","?","?"]
arr.sort((x,y)=>x.localeCompare(y, 'zh-CN'))
Run Code Online (Sandbox Code Playgroud)
一般情况下,人们会采用以下方法进行汉字拼音排序
var list=[' king ', 'a', 'li'];
list.Sort(function (a, b) {return a.localeCompare(b); });
Run Code Online (Sandbox Code Playgroud)
localeCompare() :用本地特定的顺序来比较两个字符串。
这种拼音排序方法是不可靠的。
第二种方式:非常依赖中国操作系统
非常依赖于浏览器内核也就是说,如果你的网站访问者是通过中文系统,或者是Internet Explorer浏览器(Chrome),那么他很可能无法看到我们期望的拼音排序结果。
下面我就介绍一下我对这个问题的解决方案,希望能够以某种方式推导一下:这个方法支持Unicode字符集x4e00从0到0 x9fa5区域总共20902个连续的来自中国(包括台湾)、日本、韩国、汉字,即CJK(中文日文韩文)字符。
var CompareStrings={.........}
getOrderedUnicode: function (char) {
var originalUnicode=char.charCodeAt ();
if (originalUnicode >=0 x4e00 && originalUnicode <=0 x9fa5) {
var index=this.Db.IndexOf (char);
if (index >1) {
return index + 0 x4e00;
}}
return originalUnicode;
},
compare: function (a, b) {
if (a==b) {return 0; }
//here can be rewritten according to the specific needs and the writing is the empty string at the bottom the if (a.length==0) {return 1; }
if (b.length==0) {return - 1; }
var count=a.length >B.length? B.length: a.length;
for (var i=0; i<count; i++) {
var au=this.GetOrderedUnicode (a [i]);
var bu=this.GetOrderedUnicode [i] (b);
if (au >bu) {
return 1;
} else if (au <bu) {
return - 1;
}}
return a.length >B.length? 1:1;
}}
//rewriting system native localeCompare
Run Code Online (Sandbox Code Playgroud)
原型:
LocaleCompare = function (param) {
return CompareStrings.compare said (enclosing the toString (), param);
}
Run Code Online (Sandbox Code Playgroud)
您可以通过下面的链接下载完整的代码
简单介绍一下实现原理:
根据拼音排序好字(db):有多种方法可以达到目的,我是用JavaScript+c#组合完成的,使用脚本先把所有汉字枚举出来,然后提交给c#good后台排序,并输出到前台,这只是准备工作,什么都可以。
识别两个字符谁更大(getOrderedUnicode):因为在排序的时候,不仅要处理汉字,而且要处理汉字之外的字符,所以比较器必须能够识别所有的字符,我们这里通过判断是否是一个字符就是区分汉字:如果是汉字,那么排序好词库搜索索引,索引值加上Unicode字符集第一个汉字的位置,就是经过“校准”后的Unicode字符集指标值;如果不是汉字,则直接返回Unicode字符集的索引值。
比较两个字符串(compare):通过比较两个字符串中的每一个字符(比较有效范围内,即字符串长度越短),如果发现a大于b,则返回1,反之则返回1。
比较后的有效范围内如果没有平局,就看谁长,比如a='123',b='1234',那么长b排在后面。
编辑
您还可以使用 JQuery 插件:
jQuery.extend( jQuery.fn.dataTableExt.oSort, {
"chinese-string-asc" : function (s1, s2) {
return s1.localeCompare(s2);
},
"chinese-string-desc" : function (s1, s2) {
return s2.localeCompare(s1);
}
} );
Run Code Online (Sandbox Code Playgroud)
请参阅原帖。