使用Unicode编码进行初步排序
在Javascript中,可以通过每个字符的Unicode编码来进行排序,这是一种简单且有效的方法,尤其适用于数字和英文字符。Unicode编码的分布情况如下:
类型 | 16进制范围 | 10进制范围 |
---|
数字 | [0x30,0x39] | [48,57] |
大写字母 | [0x41,0x5a] | [65,90] |
小写字母 | [0x61,0x7a] | [97,122] |
汉字 | [0x4e00,0x9fa5] | [19968,40869] |
通过Javascript的charCodeAt()
函数可以轻松获取任何字符的Unicode编码。例如,对于一个数组中的对象,我们可以通过如下代码对其进行排序:
data.sort((a, b) => a.name.charCodeAt(0) - b.name.charCodeAt(0));
这种方法能够有效地对数字和英文字母进行排序,但对于中文姓名,则需要进一步处理,以确保它们按照拼音首字母正确排序。
针对中文姓名的特殊排序处理
为了实现中文姓名的正确排序,我们可以先将数组中的所有姓名分为两类:非中文姓名(包括数字和英文)和中文姓名。然后分别对这两类数据进行排序,并最后合并结果。对于中文姓名,可以使用localeCompare()
方法,该方法支持根据语言环境进行字符串比较,特别适合用于中文拼音排序。
let chineseNames = [], otherNames = [], finalList = [];
data.forEach(item => {
if (/^[一-龥]/.test(item.name.charAt(0))) {
chineseNames.push(item); // 首字符为中文的姓名
} else {
otherNames.push(item); // 首字符为非中文的姓名(数字或字母)
}
});
otherNames.sort((a, b) => a.name.charCodeAt(0) - b.name.charCodeAt(0));
chineseNames.sort((a, b) => a.name.localeCompare(b.name, 'zh', {sensitivity: 'base'}));
finalList = otherNames.concat(chineseNames); // 合并排序后的数组
示例演示
假设我们有一个包含多种类型姓名的数组:
const originalData = [
{name: '66'},
{name: 'wuhaha'},
{name: '余喝'},
{name: '12'},
{name: '安安'},
{name: '大伯'},
{name: 'zhaha'}
];
经过上述排序处理后,输出的结果应为:
[{name: '12'},
{name: '66'},
{name: 'wuhaha'},
{name: 'zhaha'},
{name: '安安'},
{name: '大伯'},
{name: '余喝'}]