JS字符串排序规则(编码排序、字典排序)

0 阅读1分钟

编码排序

默认的排序规则就是编码排序,这里的编码就是 Unicode 编码,js 的数组的 sort 方法的默认排序规则就是编码排序。

通过 string.codePointAt 方法可以获取字符的Unicode编码

console.log('a'.codePointAt(0)); // 97
console.log('A'.codePointAt(0)); // 65
console.log('z'.codePointAt(0)); // 122
console.log('Z'.codePointAt(0)); // 90
console.log('赵'.codePointAt(0)); // 36213
console.log('钱'.codePointAt(0)); // 38065
console.log('孙'.codePointAt(0)); // 23385
console.log('李'.codePointAt(0)); // 26446

const arr2 = ['a', 'A', 'z', 'Z', '赵', '钱', '孙', '李']
arr2.sort()
console.log(arr2); // ['A',  'Z',  'a', 'z',  '孙', '李', '赵', '钱']

将编码转回字符,可以使用 String.formCodePoint(编码值: number)

平常的比较大小也是通过这个编码大小来比较的

字典排序

字典排序就是拼音排序,更多的应用在中文需要排序的场景

在js中可以通过 localeCompare 方法来进行比较

​referenceStr.localeCompare(compareString, locales?, options?)​

如果引用字符串(referenceStr​)存在于比较字符串(compareString​)之前则为负数;如果引用字符串存在于比较字符串之后则为正数;相等的时候返回 0​。

console.log('赵'.localeCompare('钱')); // 1
console.log('钱'.localeCompare('孙')); // -1
console.log('孙'.localeCompare('李')); // 1
console.log('李'.localeCompare('里')); // -1

这个顺序我也不知道到底是拼音的什么顺序。。。

可以通过sort达到中文排序的效果

const arr = ['赵', '钱', '孙', '李', '周', '吴', '吴一', '吴二', '吴一一'];
arr.sort((a, b)=>a.localeCompare(b))
console.log(arr); // ['李','钱','孙','吴','吴二','吴一','吴一一','赵','周']
arr.sort((a, b)=>b.localeCompare(a))
console.log(arr); // ['周','赵','吴一一','吴一','吴二','吴','孙','钱','李']

这个方法有个问题,对于字母的大小写排序规则和编码不一致,数字 < 字母,小写字母 < 大写字母,大小写的A < 大小写的Z

const arr1 = ['z', 'Z', 'a', 'A']
arr1.sort((a, b)=>a.localeCompare(b))
console.log(arr1); // [ 'a', 'A', 'z', 'Z' ]