问题

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
});
最后修改:2023 年 03 月 15 日
你的赞赏是我前进的动力