JavaScript实现拼音排序的方法


Posted in Javascript onNovember 20, 2012

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

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.3water.com/201211/yuanma/js_pinyin_3water.rar
简单介绍一下实现的原理:
1. 取得按拼音排序好的字库(db):有多种途径可以达到目的,我是用JavaScript+C#组合完成的,先用脚本把所有汉字枚举出来,再提交到C#后台排序好,再输出到前台,这个只是准备工作哈,怎么搞都可以。
2. 确定两个字符谁比较大(getOrderedUnicode):因为排序的时候,不光要处理汉字,还要处理汉字以外的字符,所以比较器必须能识别所有的字符,这里我们通过判断一个字符是否是汉字来区别对待:如果是汉字,那么就在排序好的字库里搜索它的索引值,得到的索引值再加上Unicode字符集中第一个汉字所处的位置,就是在“校准”以后的Unicode字符集中的索引值了;如果不是汉字,那么就直接返回它在Unicode字符集中的索引值即可。
3. 比较两个字符串(compare):逐一比较两个字符串中的每一个字符(在有效范围内比较,也就是较短的那个字符串的长度),如果发现a比b大,就返回1,反之返回-1。
4. 在有效范围内比较结束后如果还没分出胜负,就看谁比较长,例如a='123',b='1234',那么较长的b要排在后面。
绿色通道: 好文要顶 关注我 收藏该文与我联系
Javascript 相关文章推荐
javascript jQuery插件练习
Dec 24 Javascript
JQuery扩展插件Validate 3通过参数设置错误信息
Sep 05 Javascript
javascript 实现键盘上下左右功能的小例子
Sep 15 Javascript
Node.js实现在目录中查找某个字符串及所在文件
Sep 03 Javascript
Javascript Memoizer浅析
Oct 16 Javascript
jQuery中ajax的post()方法用法实例
Dec 26 Javascript
jQuery将所有被选中的checkbox某个属性值连接成字符串的方法
Jan 24 Javascript
javascript制作照片墙及制作过程中出现的问题
Apr 04 Javascript
bootstrap table表格使用方法详解
Apr 26 Javascript
详解为生产环境编译Angular2应用的方法
Dec 10 Javascript
jQuery实现获取当前鼠标位置并输出功能示例
Jan 05 jQuery
jquery+php后台实现省市区联动功能示例
May 23 jQuery
Js+Flash实现访问剪切板操作
Nov 20 #Javascript
利用JQuery和JS实现奇偶行背景颜色自定义效果
Nov 19 #Javascript
jQuery 数据缓存模块进化史详细介绍
Nov 19 #Javascript
基于jquery库的tab新形式使用
Nov 16 #Javascript
jquery getScript动态加载JS方法改进详解
Nov 15 #Javascript
javascript 图片裁剪技巧解读
Nov 15 #Javascript
中国地区三级联动下拉菜单效果分析
Nov 15 #Javascript
You might like
一个php导出oracle库的php代码
2009/04/20 PHP
深入Memcache的Session数据的多服务器共享详解
2013/06/13 PHP
使用PHP会话(Session)实现用户登陆功能
2013/06/29 PHP
Thinkphp多文件上传实现方法
2014/10/31 PHP
父窗口获取弹出子窗口文本框的值
2006/06/27 Javascript
dojo学习第一天 Tab选项卡 实现
2011/08/28 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
js将json格式的对象拼接成复杂的url参数方法
2016/05/25 Javascript
javascript表达式和运算符详解
2017/02/07 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
2017/02/21 Javascript
bootstrap table实现单击单元格可编辑功能
2017/03/28 Javascript
Vue form 表单提交+ajax异步请求+分页效果
2017/04/22 Javascript
vue 组件之间事件触发($emit)与event Bus($on)的用法说明
2020/07/28 Javascript
python多线程用法实例详解
2015/01/15 Python
浅谈Python由__dict__和dir()引发的一些思考
2017/10/30 Python
Python二叉树的定义及常用遍历算法分析
2017/11/24 Python
Python中单、双下划线的区别总结
2017/12/01 Python
pandas 数据实现行间计算的方法
2018/06/08 Python
python实现日志按天分割
2019/07/22 Python
Python获取、格式化当前时间日期的方法
2020/02/10 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
2020/03/04 Python
python 等差数列末项计算方式
2020/05/03 Python
在pycharm中debug 实时查看数据操作(交互式)
2020/06/09 Python
简述python&amp;pytorch 随机种子的实现
2020/10/07 Python
加拿大领先的冒险和户外零售商:Atmosphere
2017/12/19 全球购物
荷兰照明、灯具和配件网上商店:dmlights
2019/08/25 全球购物
大学军训感言1500字
2014/03/09 职场文书
电子信息工程自荐信
2014/05/26 职场文书
授权委托书格式范文
2014/08/02 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
亮剑观后感
2015/06/05 职场文书
飞越疯人院观后感
2015/06/09 职场文书
小型婚礼主持词
2015/06/30 职场文书
导游词之西安骊山
2019/12/03 职场文书
关于vue中如何监听数组变化
2021/04/28 Vue.js