当我们需要对数据进行拼音排序的时候,我们可能会用到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,可以预见他内部就是按单个字符匹配的,并且没有多音字的处理。所以抛开语义来说,他也是按了拼音排序了。
如果要求更高,解决这种问题只能是引入其他中文词库,对特殊的词语结合能自动识别多音字的实际拼音,或是手动调整自己词库里面多音字的优先级,复杂度高很多。