大连仟亿科技
客服中心
  • 电话
  • 电话咨询:0411-39943997
  • 手机
  • 手机咨询:15840979770
    手机咨询:13889672791
网络营销 >更多
您现在的位置:仟亿科技 > 新闻中心 > 常见问题

JS汉字拼音排序的方法实例

作者:billionnet 发布于:2012/11/22 17:17:50 点击量:

 

一般情况下,大家会使用下面的方法来进行汉字的拼音排序

var list = [ '王', '张','李']; 
list.sort(function (a, b) { 
return a.localeCompare(b); 
}); 

localeCompare() :用本地特定的顺序来比较两个字符串。 
通过localeCompare这个方法来进行拼音排序的不可靠之处在于: 
1. 很依赖中文操作系统 
2. 很依赖浏览器的内核 
也就是说,如果你的网站访问者是通过非中文系统,或者非IE浏览器(如Chrome),那么他将很可能无法看到我们所预期的拼音排序结果。 
-------------------------------------------------------------------------------- 
下面介绍一下我解决这个问题的办法,希望能抛砖引玉哈: 
本方法支持Unicode字符集中从0x4E00到 0x9FA5 的连续区域内共20902个来自中国(包括台湾)、日本、韩国的汉字,即CJK(Chinese Japanese Korean)汉字。

var CompareStrings = { 
db: '吖阿啊锕錒嗄哎哀...袰襨鐢閪闏霻鶑', // 其中省略几万字 
getOrderedUnicode: function (char) { 
var originalUnicode = char.charCodeAt(); 
if (originalUnicode >= 0x4E00 && originalUnicode <= 0x9FA5) { 
var index = this.db.indexOf(char); 
if (index > -1) { 
return index + 0x4E00; 
} 
} 
return originalUnicode; 
}, 
compare: function (a, b) { 
if (a == b) {  return 0; 
} 
// 这里可以根据具体需求来改写,目前的写法是把空字符串排在后面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(b[i]); 
if (au > bu) { 
return 1; 
} else if (au < bu) { 
return -1; 
} 
} 
return a.length > b.length ? 1 : -1; 
} 
} 
// 重写系统原生的localeCompare 
String.prototype.localeCompare = function (param) { 
return CompareStrings.compare(this.toString(), param); 
} 

大家可以通过下面的链接下载到完整代码 http://xiazai.jb51.net/201211/yuanma/js_pinyin_jb51.rar 
简单介绍一下实现的原理: 
1. 取得按拼音排序好的字库(db):有多种途径可以达到目的,我是用JavaScript+C#组合完成的,先用脚本把所有汉字枚举出来,再提交到C#后台排序好,再输出到前台,这个只是准备工作哈,怎么搞都可以。 
2. 确定两个字符谁比较大(getOrderedUnicode):因为排序的时候,不光要处理汉字,还要处理汉字以外的字符,所以比较器必须能识别所有的字符,这里我们通过判断一个字符是否是汉字来区别对待:如果是汉字,那么就在排序好的字库里搜索它的索引值,得到的索引值再加上Unicode字符集中第一个汉字所处的位置,就是在“校准”以后的Unicode字符集中的索引值了;如果不是汉字,那么就直接返回它在Unicode字符集中的索引值即可。 
3. 比较两个字符串(compare):逐一比较两个字符串中的每一个字符(在有效范围内比较,也就是较短的那个字符串的长度),如果发现a比b大,就返回1,反之返回-1。 
4. 在有效范围内比较结束后如果还没分出胜负,就看谁比较长,例如a='123',b='1234',那么较长的b要排在后面。



分享到:


评论加载中...
内容:
评论者: 验证码:
  

Copyright@ 2011-2017 版权所有:大连仟亿科技有限公司 辽ICP备11013762-1号   google网站地图   百度网站地图   网站地图

公司地址:大连市沙河口区中山路692号辰熙星海国际2215 客服电话:0411-39943997 QQ:2088827823 42286563

法律声明:未经许可,任何模仿本站模板、转载本站内容等行为者,本站保留追究其法律责任的权利! 隐私权政策声明