JavaScript实现拼音排序的方法

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


代码如下:

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要排在后面。
绿色通道: 好文要顶 关注我 收藏该文与我联系

(0)

相关推荐

  • 用正则表达式判断字符串是汉字还是拼音的js函数代码

    复制代码 代码如下: function checkFormat(str) { if (escape(str).indexOf("%u")!=-1) alert("不能含有汉字"); else if(str.match(/\D/)!=null) { alert('不能含有字母'); } }

  • js 淘宝首页的拼音排序效果

    无标题文档 dl,dd,dt { margin:0; padding:0; } #qq { width:600px; overflow:hidden; height:500px; margin:0 auto; background:#fafafa; padding:15px; } #qq span { display:block; width:80px; height:25px; line-height:25px; float:left; } dl { width:500px; line-hei

  • JS实现中文汉字按拼音排序的方法

    本文实例讲述了JS实现中文汉字按拼音排序的方法.分享给大家供大家参考,具体如下: 代码1,拼音排序: var array = ['武汉', '北京', '上海', '天津']; var resultArray = array.sort( function compareFunction(param1, param2) { return param1.localeCompare(param2,"zh"); } ); console.log(resultArray); 火狐浏览器 resu

  • js仿淘宝的拼音检索特效代码

    以下是HTML网页特效代码,点击运行按钮可查看效果 js仿taobao效果 *{ margin:0;padding:0;} body{ font:normal 12px Verdana, Arial, Helvetica, sans-serif; text- align:center;} #warpper{ position:absolute; left:100px; top:100px;} h5{ float:left;} a{ text-decoration:underline; curso

  • js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME

    具体技术 1.使用GB编码与UNICODE的转换 2.数组关联排序 注意:GB编码 库地址 http://demo.jb51.net/jslib/qswhGB2312.js 代码(demo写的很简陋) 复制代码 代码如下: <script> //power by 毛绒猫猫 liuyutong@baidu.com var strGB="啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬 扳般颁板版扮拌伴瓣半

  • Extjs Gird 支持中文拼音排序实现代码

    复制代码 代码如下: <script type="text/javascript"> Ext.data.Store.prototype.applySort=function(){//重载applySort if(this.sortInfo && !this.remoteSort){ var s = this.sortInfo, f=s.field; var st=this.fields.get(f).sortType; var fn=function(r1,

  • js实现汉字排序的方法

    本文实例讲述了js实现汉字排序的方法.分享给大家供大家参考.具体如下: <script type="text/javascript"> <!-- function startSort(){ var a=document.getElementById('s').value; a=a.split(',') a.sort(); document.getElementById('r1').value=a; a.sort(function(a,b){return a.local

  • javaScript对文字按照拼音排序实现代码

    复制代码 代码如下: <title>JavaScript对文字按照拼音排序</title><SCRIPT type="text/javascript">function defaultSort(){var a="zhongguo,daguo,世界,中国,超级大国";a=a.split(",");a.sort();alert(a);}function cusSort(){var a="zhongguo,

  • 利用JavaScript对中文(汉字)进行排序实例详解

    前言 在网页上展示列表时经常需要对列表进行排序:按照修改/访问时间排序.按照地区.按照名称排序. 对于中文列表按照名称排序就是按照拼音排序,不能简单通过字符串比较-- 'a' > 'b'--这种方式来实现. 比如比较 '北京' vs '上海',实际是比较 'běijīng' vs 'shànghǎi':比较 '北京' vs '背景',实际是比较 'běijīng' vs 'bèijǐng'. 一般需要获取到字符串的拼音,再比较各自的拼音. 实现方法 JavaScript 提供本地化文字排序,比如

  • javascript对中文按照拼音排序代码

    今天在代码中用到了对中文按照拼音排序,咨询了群里面的大神后得到了下面的代码: var arr = ["张三","李四","王五","阿三"]; document.write(arr+"<br/>"); arr.sort(function(a,b){ return a.localeCompare(b); }); document.write(arr);

  • JavaScript 给汉字排序实例代码

    比如 var arr = ["中","华","人","民","共","和","国"],在执行 sort 方法后结果为 :中,人,共,华,和,国,民,既不是拼音也不是笔划数量的排序.     以前很少留意过 localeCompare 方法,手册中说它执行时返回一个值,指出在当前的区域设置中两个字符串是否相同.返回值有三种:-1,0,1,刚好是 sort 方法参数所需要

  • js汉字转拼音实现代码

    代码下载:复制以下代码到PinYin.js即可.调用方法: var pinyin = codefans_net_CC2PY("你好吗");PinYin.js 复制代码 代码如下: var PinYin = {"a":"\u554a\u963f\u9515","ai":"\u57c3\u6328\u54ce\u5509\u54c0\u7691\u764c\u853c\u77ee\u827e\u788d\u7231\u9

随机推荐