sort默认是按照编码顺序排序names.sort()
如果希望按照字典顺序排序,可以使用localeComparenames.sort((a,b)=>a.localeCompare(b))
localeCompare主要作用就是比较两个字符串的顺序,然后返回一个(-1, 0, 1)之间的数字
localeCompare的参数
localeCompare(compareString, locales, options)
locales:表示缩写语言代码(BCP 47 language tag)的字符串,或由此类字符串组成的数组。对应于 Intl.Collator() 构造函数的 locales 参数。 在不支持 Intl.Collator 的实现中,该参数会被忽略,并且通常会使用主机的区域设置。
使用locales参数来提供要比较的语言。zh-Hans-CN 是简体中文的排序规则。
options:一个调整输出格式的对象。对应于 Intl.Collator() 构造函数的 options 参数。 在不支持 Intl.Collator 的实现中,该参数会被忽略。
sensotivity 是灵敏度,包括 base、accent、case、variant这几种灵敏度。
注意事项
1、localeCompare() 方法是大小写敏感的。例如,"a" 和 "A" 是不同的字符。
2、localeCompare() 方法也是重音符号敏感的。例如,"é" 和 "è" 是不同的字符。
3、localeCompare() 方法的默认区域设置是当前系统的区域设置。
4、localeCompare() 方法返回的数字取决于本地排序规则。不同的语言和不同的区域设置可能会有不同的排序规则。
5、localeCompare() 方法不会更改原始字符串。它只是返回一个数字
let names = ["刘消防", "超人", '马大力', "金栈", "萧炎", "药老", "美杜莎", "曹操"]
names.sort(); // 默认按照字符编码排序的
console.log(names[0].charCodeAt(0)); // 刘 对应的Unicode编码是21016
console.log(names[1].charCodeAt(0)); // 超 对应的Unicode编码是32654
console.log(names[2].charCodeAt(0)); // 马 对应的Unicode编码是33647
console.log(names[3].charCodeAt(0)); // 金 对应的Unicode编码是33831
// ..... 马应该在金之前 曹操在刘消防之前
console.log(names.sort());
// 结果是 ['刘消防', '曹操', '美杜莎', '药老', '萧炎', '超人', '金栈', '马大力']
// 字符串方法localeCompare()
console.log('刘'.localeCompare("曹")); // 结果为 1 说明刘在字典里是在曹之后的
// 如果结果为 0 说明顺序一样,
// 如果为 -1 说明刘在字典里是在曹前的
names.sort((a,b)=>a.localeCompare(b)); // 按字典里先后顺序排序,
// 按照a.localeCompare(b)等于1的排序,顺序为 名字在字典之前的名字 ==> 在字典靠后的名字
console.log(names);
// ['曹操', '超人', '金栈', '刘消防', '马大力', '美杜莎', '萧炎', '药老']
const array = ['刘一','陈二','张三','李四' ,'王五' ,'赵六' ,'孙七','周八','吴九','郑十']
array.sort(function (a, b) {
return a.localeCompare(b, 'zh-Hans-CN', { sensitivity: 'accent' })
})