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 相关文章推荐
js实现权限树的更新权限时的全选全消功能
Feb 17 Javascript
JS 参数传递的实际应用代码分析
Sep 13 Javascript
js操作select控件的几种方法
Jun 02 Javascript
getElementByIdx_x js自定义getElementById函数
Jan 24 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
Sep 22 Javascript
JavaScript常用脚本汇总(三)
Mar 04 Javascript
js获取当前日期时间及其它操作汇总
Apr 17 Javascript
JavaScript学习笔记之数组的增、删、改、查
Mar 23 Javascript
js拖拽的原型声明和用法总结
Apr 04 Javascript
js实现做通讯录的索引滑动显示效果和滑动显示锚点效果
Feb 18 Javascript
在knockoutjs 上自己实现的flux(实例讲解)
Dec 18 Javascript
详解Vue 如何监听Array的变化
Jun 06 Javascript
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
多文件上传的例子
2006/10/09 PHP
《PHP编程最快明白》第七讲:php图片验证码与缩略图
2010/11/01 PHP
PHP 字符串正则替换函数preg_replace使用说明
2011/07/15 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
Javascript仿PHP $_GET获取URL中的参数
2014/05/12 Javascript
jquery实现文本框textarea自适应高度
2016/03/09 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
vue2笔记 — vue-router路由懒加载的实现
2017/03/03 Javascript
详解利用jsx写vue组件的方法示例
2017/07/17 Javascript
JavaScript 值类型和引用类型的初次研究(推荐)
2017/07/19 Javascript
npm 更改默认全局路径以及国内镜像的方法
2018/05/16 Javascript
Node.js如何对SQLite的async/await封装详解
2019/02/14 Javascript
[01:10]DOTA2次级职业联赛 - Fly战队宣传片
2014/12/01 DOTA
解决python3中自定义wsgi函数,make_server函数报错的问题
2017/11/21 Python
解决pycharm安装后代码区不能编辑的问题
2018/10/28 Python
python面向对象入门教程之从代码复用开始(一)
2018/12/11 Python
Python Numpy计算各类距离的方法
2019/07/05 Python
基于python实现地址和经纬度转换
2020/05/19 Python
python爬虫用scrapy获取影片的实例分析
2020/11/23 Python
Hunter Boots美国官方网站:赫特威灵顿雨靴
2018/06/16 全球购物
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
土木工程专业大学毕业生求职信
2013/10/13 职场文书
大学生毕业自我鉴定范文
2013/11/03 职场文书
安全大检查实施方案
2014/02/22 职场文书
《白鹅》教学反思
2014/04/13 职场文书
2014乡镇领导班子四风对照检查材料思想汇报
2014/10/05 职场文书
小石潭记导游词
2015/02/03 职场文书
行政撤诉申请书
2015/05/18 职场文书
婚宴新娘致辞
2015/07/28 职场文书
三十年同学聚会感言
2015/07/30 职场文书
物资采购管理制度
2015/08/06 职场文书
财产分割协议书
2016/03/22 职场文书
golang 实现对Map进行键值自定义排序
2021/04/28 Golang
Python批量将csv文件转化成xml文件的实例
2021/05/10 Python
MySQL CHAR和VARCHAR该如何选择
2021/05/31 MySQL
利用Redis实现点赞功能的示例代码
2022/06/28 Redis