localeCompare的疑惑

当我们需要对数据进行拼音排序的时候,我们可能会用到js的localeCompare函数,通过这个函数确实可以做到中英文按拼音首字母排序,例如下面我在网上找的一段demo

var citys = ['北京-b','上海-s','广州-g','深圳-s','南京-n','苏州-s','杭州-h','济南-j','青岛-q','武汉-w','沈阳-sh','成都-ch','天津-t','重庆-ch','西安-x','郑州-zh','石家庄-sh','长沙-ch','长春-ch','合肥-h','福州-f'];


function sortRule(a,b) {
	return a.localeCompare(b);
}

console.log(citys.sort(sortRule));

得到的结果是:北京-b,成都-ch,福州-f,广州-g,杭州-h,合肥-h,济南-j,南京-n,青岛-q,上海-s,深圳-s,沈阳-sh,石家庄-sh,苏州-s,天津-t,武汉-w,西安-x,长春-ch,长沙-ch,郑州-zh,重庆-ch

这个一开始看,以为是localeCompare有bug,特别最后几个怎么是重庆,长沙之类的。但再想下,其实长和重是多音字,使用localeCompare,可以预见他内部就是按单个字符匹配的,并且没有多音字的处理。所以抛开语义来说,他也是按了拼音排序了。

如果要求更高,解决这种问题只能是引入其他中文词库,对特殊的词语结合能自动识别多音字的实际拼音,或是手动调整自己词库里面多音字的优先级,复杂度高很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值