问题
js的sort函数的默认排序方法是将排序对象转成字符串,然后根据字符串中每个字符的ascll码依次进行排序,对于不在ascll表中的中文无法进行排序。
localeCompare
localeCompare函数可以比较两个中文的顺序,用该方法配合sort方法可以实现中文排序:
names.sort((a, b) => {
return a.username.localeCompare(b.username, 'zh');
});
进一步,如果想获得中文首字母,可以依次和每个字母的第一个中文进行比较,进而得出该中文字符的首字母:
const getFirstLetter = function(word) {
let letters = "ABCDEFGHJKLMNOPQRSTWXYZ#";
let zh = "阿八嚓哒妸发旮哈讥咔垃呣拏噢妑七呥扨它穵夕丫帀糳";
for (let i = 0; i < letters.length - 1; i++) {
if (word.localeCompare(zh[i], 'zh') >= 0 && word.localeCompare(zh[i + 1], 'zh') < 0) {
return letters[i]
}
}
return '#'
};
注意有些字母没有对应的姓氏,因此不在比较之列。
本方法最大的问题是,微信小程序和很多浏览器内核都不支持该函数,用之前先做好测试。
第三方库
若不能使用上述方法,发现一个第三方库jian-pinyin,体积不大,可以直接给出汉字的拼音,很棒。
地址:https://github.com/xinglie/pinyin
通过该库直接获取汉字的拼音,然后通过sort函数进行排序,注意js中字符串之间是可以直接比较大小的,比较的依据仍然是ascll。
let sp = function(word) {
return getSpell(word, function(charactor, spell) {
return spell[0];
}, '')
}
names.sort((a, b) => {
a = sp(a.username);
b = sp(b.username);
if (a < b) return -1;
if (a > b) return 1;
return 0
});