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 相关文章推荐
制作特殊字的脚本
Jun 26 Javascript
JavaScript中的原型链prototype介绍
Dec 30 Javascript
jquery使用animate方法实现控制元素移动
Mar 27 Javascript
Javascript监视变量变化的方法
Jun 09 Javascript
javascript实现添加附件功能的方法
Nov 18 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
Nov 25 Javascript
移动端界面的适配
Jan 11 Javascript
bootstarp modal框居中显示的实现代码
Feb 18 Javascript
Vue.js组件间的循环引用方法示例
Dec 27 Javascript
详解使用mpvue开发github小程序总结
Jul 25 Javascript
JavaScript动态创建二维数组的方法示例
Feb 01 Javascript
React如何使用axios请求数据并把数据渲染到组件
Aug 05 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
PHP的范围解析操作符(::)的含义分析说明
2011/07/03 PHP
基于PHP CURL获取邮箱地址的详解
2013/06/03 PHP
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
2013/06/20 PHP
php mb_substr()函数截取中文字符串应用示例
2014/07/29 PHP
php使用mysqli向数据库添加数据的方法
2015/03/20 PHP
PHP实现的简单缓存类
2015/07/29 PHP
PHP simplexml_load_string()函数实例讲解
2019/02/03 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
Firefox outerHTML实现代码
2009/06/04 Javascript
javascript 面向对象编程基础:封装
2009/08/21 Javascript
javascript Math.random()随机数函数
2009/11/04 Javascript
js中匿名函数的N种写法
2010/09/08 Javascript
js三种排序算法分享
2012/08/16 Javascript
探索Emberjs制作一个简单的Todo应用
2012/11/07 Javascript
载入jQuery库的最佳方法详细说明及实现代码
2012/12/28 Javascript
JavaScript使用RegExp进行正则匹配的方法
2015/07/11 Javascript
AngularJS入门教程之控制器详解
2016/07/27 Javascript
微信小程序scroll-view隐藏滚动条的方法详解
2020/03/25 Javascript
对Python 2.7 pandas 中的read_excel详解
2018/05/04 Python
Python带动态参数功能的sqlite工具类
2018/05/26 Python
详解django.contirb.auth-认证
2018/07/16 Python
Python 做曲线拟合和求积分的方法
2018/12/29 Python
matplotlib绘制多个子图(subplot)的方法
2019/12/03 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
2020/01/08 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
2020/05/26 Python
浅谈django框架集成swagger以及自定义参数问题
2020/07/07 Python
通用自荐信范文
2014/03/14 职场文书
贷款委托书范本
2014/04/08 职场文书
人代会标语
2014/06/30 职场文书
2014年留守儿童工作总结
2014/12/10 职场文书
闪闪红星观后感
2015/06/08 职场文书
数学备课组工作总结
2015/08/12 职场文书
庆祝教师节主题班会
2015/08/17 职场文书
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
2021/06/30 SQL Server