【JS】中文名按字典顺序排序(localeCompare)与编码顺序排序

583 阅读2分钟

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

文档 参考:www.jianshu.com/p/86fc1674f…