javascript中文按拼音顺序排序

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
});