需求:数字和英文按 123,abc顺序,中文按拼音首字母排序
const ori = ['中', '文', '排', '序', '1中', '1文', '1排', '1序', 'a中', 'a中', 'a排', 'a序', 'c中', 'c文','c排', 'c序', 1, 'a', 'c']Array 的默认排序方法 sortsort默认按字符的Unicode编码进行排序
// 获取排序前的Unicode编码ori.forEach(i => console.log(i.toString().charCodeAt(0)))// 20013// 25991// 25490// 24207// 49 * 4// 97 * 4// 99 * 4// 49// 97// 99const sort1 = [...ori]sort1.sort()// [1, '1中', '1序', '1排', '1文', 'a', 'a中', 'a中', 'a序', 'a排', 'c', 'c中', 'c序', 'c排', 'c文', '中', '序', '排', '文']// 查看排序后的Unicode编码sort1.forEach(i => console.log(i.toString().charCodeAt(0)))// 49 * 5// 97 * 5// 99 * 5// 20013// 24207// 25490// 25991可以看到默认的排序方式,无法完成对中文字符按拼音首字母排序,因此需要借助 localeCompare 方法进行辅助排序
完整的排序方案export function mixSort(_a, _b) { const reg = /[a-zA-Z0-9]/ // 比对仅针对字符串,数字参与对比会导致对比的字符串转为number类型,变成NaN const a = _a.toString() const b = _b.toString() // 比对0号位的原因是字符串中有可能出现中英文混合的情况,这种仅按首位排序即可 if (reg.test(a[0]) || reg.test(b[0])) {if (a > b) { return 1} else if (a < b) { return -1} else { return 0} } else {return a.localeCompare(b) }}const sort2 = [...ori]sort2.sort((a, b) => mixSort(a, b))// [1, '1中', '1序', '1排', '1文', 'a', 'a中', 'a中', 'a序', 'a排', 'c', 'c中', 'c序', 'c排', 'c文', '排', '文', '序', '中']该方法已基本符合预期,如果需要针对首位英文或数字字符相同,后面中文二次排序的情况,就需要额外处理,此处不再展开