js代码,如何利用localeCompare做字符串比较排序?
发布于 作者:苏南大叔 来源:程序如此灵动~写一个js
排序函数,叫做localeCompare
。具体的使用场景就类似于资源管理器里面,根据文件名对文件进行排序。这个排序的标准是什么呢?字母排序。那么,不同的国家文字,字母排序也是不一样的。
大家好,这里是苏南大叔的程序如此灵动博客,这里记录计算机代码的故事。字母排序的问题,这里提供的是个排序标准的问题,普通浏览器里面也是可以使用的。测试环境:node@16.14.2
,chrome@103.0.5060.53
。
概述
String.prototype.localeCompare()
localeCompare()
方法返回一个数字来指示一个参考字符串是否在排序顺序前面或之后或与给定字符串相同。
参考文档:
根据官方描述,
locales
和options
参数不一定生效。- 返回值也可能不一致,正常情况下来说,返回值是
-1、0、1
中的一个。
新的locales
和options
参数能让应用程序定制函数的行为,即指定用来排序的语言。locales
和options
参数完全取决于实现,在旧的实现中忽略这两个参数。
测试代码:
var strList = ['cc','ca', 'aa','2','10','02',"早上","中午","晚上"];
strList.sort((a, b) => {
// return a.localeCompare(b);
return a.localeCompare(b,"zh-cn");
});
console.log(strList);
返回值:
[
'02', '10',
'2', '晚上',
'早上', '中午',
'aa', 'ca',
'cc'
]
参数locales
传入一个语言字符串,来定义一下排序的语言基础,中文的编码是gb2312
。
下面的例子,是官方给出的例子。de
是德国,sv
是瑞典。
console.log('?'.localeCompare('z', 'de')); // a negative value: in German, ? sorts with a
console.log('?'.localeCompare('z', 'sv')); // a positive value: in Swedish, ? sorts after z
参数options
根据官方说明,这些具体的参数也是可以不支持的。比如最后面的numeric
和caseFirst
。所以,大家就看情况使用了。
名称 | 说明 | 取值 | 默认值 |
---|---|---|---|
localeMatcher | 地域匹配算法的使用 | "lookup" "best fit" | best fit |
usage | 指定比较的目标是排序或者是搜索 | "sort" "search" | sort |
sensitivity | 指定排序程序的敏感度 | "base" "accent" "case" "variant" | variant |
ignorePunctuation | 指定是否忽略标点 | true false | false |
numeric | 是否指定使用数字排序 | true false | false |
caseFirst | 大小写有限排序 | "upper"、"lower" 或 "false" | "false" |
sensitivity
的更详细说明:
- "base": 只有不同的字母字符串比较是不相等的。举个例子: a ≠ b, a = á, a = A.
- "accent": 只有不同的字母或读音比较是不相等的。举个例子: a ≠ b, a ≠ á, a = A.
- "case": 只有不同的字母或大小写比较是不相等的。举个例子: a ≠ b, a = á, a ≠ A.
- "variant": 不同的字母或读音及其它有区别的标志或大小写都是不相等的, 还有其它的差异可能也会考虑到。举个例子: a ≠ b, a ≠ á, a ≠ A.
下面的还是官方范例:
// in German, ? has a as the base letter
console.log('?'.localeCompare('a', 'de', { sensitivity: 'base' })); // 0
// in Swedish, ? and a are separate base letters
console.log('?'.localeCompare('a', 'sv', { sensitivity: 'base' })); // a positive value
对于历史遗留的版本号排序的问题,如果在本文中,也许就有个答案。
var strList = ['2','10','02'];
strList.sort((a, b) => {
return a.localeCompare(b,"zh-cn");
});
console.log(strList);
var strList = ['2','10','02'];
strList.sort((a, b) => {
return a.localeCompare(b,"zh-cn",{numeric:true});
});
console.log(strList);
假如在软件版本号的情况下,排序的三个数是['1','10','2']的话。那么,目前常规情况下识别为字符串的情况下,排序结果是['1','10','2']。实际上,苏南大叔期待的排序结果是['1','10','2']。
这个问题,参考文章:
返回值【重点】
a.localeCompare(b)
,正常情况下来说,返回值是-1、0、1
中的一个。但是,根据文档描述,不同的浏览器实现不一样,也可能会返回-2
、2
之类的值。
所以,返回值判断的标准是:
- 负数,意思是a的排序比b靠前。
- 零,表示两者排序应该是一致的。
- 正数,表示a的排序比b靠后。
相关文章
- https://newsn.net/say/mysql-order-by-field-length.html
- https://newsn.net/say/centos-find-bigfile.html
综述
这个函数比较小众化,官方态度也不是很明确。大概思路上就是,负数表示考前,零表示相同,正数表示靠后,就可以了。至于更多的事情,这个就不是我们所需要考虑的了。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。