我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

写一个js排序函数,叫做localeCompare。具体的使用场景就类似于资源管理器里面,根据文件名对文件进行排序。这个排序的标准是什么呢?字母排序。那么,不同的国家文字,字母排序也是不一样的。

苏南大叔:js代码,如何利用localeCompare做字符串比较排序? - 字符串比较排序
js代码,如何利用localeCompare做字符串比较排序?(图5-1)

大家好,这里是苏南大叔的程序如此灵动博客,这里记录计算机代码的故事。字母排序的问题,这里提供的是个排序标准的问题,普通浏览器里面也是可以使用的。测试环境:node@16.14.2chrome@103.0.5060.53

概述

String.prototype.localeCompare()

localeCompare()方法返回一个数字来指示一个参考字符串是否在排序顺序前面或之后或与给定字符串相同。

参考文档:

根据官方描述,

  • localesoptions参数不一定生效。
  • 返回值也可能不一致,正常情况下来说,返回值是-1、0、1中的一个。
新的localesoptions参数能让应用程序定制函数的行为,即指定用来排序的语言。localesoptions参数完全取决于实现,在旧的实现中忽略这两个参数。

测试代码:

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'
]

苏南大叔:js代码,如何利用localeCompare做字符串比较排序? - 测试代码一
js代码,如何利用localeCompare做字符串比较排序?(图5-2)

参数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

苏南大叔:js代码,如何利用localeCompare做字符串比较排序? - localecompare-code
js代码,如何利用localeCompare做字符串比较排序?(图5-3)

参数options

根据官方说明,这些具体的参数也是可以不支持的。比如最后面的numericcaseFirst。所以,大家就看情况使用了。

名称说明取值默认值
localeMatcher地域匹配算法的使用"lookup" "best fit"best fit
usage指定比较的目标是排序或者是搜索"sort" "search"sort
sensitivity指定排序程序的敏感度"base" "accent" "case" "variant"variant
ignorePunctuation指定是否忽略标点true falsefalse
numeric是否指定使用数字排序true falsefalse
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); 

苏南大叔:js代码,如何利用localeCompare做字符串比较排序? - 测试代码二
js代码,如何利用localeCompare做字符串比较排序?(图5-4)

假如在软件版本号的情况下,排序的三个数是['1','10','2']的话。那么,目前常规情况下识别为字符串的情况下,排序结果是['1','10','2']。实际上,苏南大叔期待的排序结果是['1','10','2']。

这个问题,参考文章:

苏南大叔:js代码,如何利用localeCompare做字符串比较排序? - 版本号排序实验
js代码,如何利用localeCompare做字符串比较排序?(图5-5)

返回值【重点】

a.localeCompare(b),正常情况下来说,返回值是-1、0、1中的一个。但是,根据文档描述,不同的浏览器实现不一样,也可能会返回-22之类的值。

所以,返回值判断的标准是:

  • 负数,意思是a的排序比b靠前。
  • 零,表示两者排序应该是一致的。
  • 正数,表示a的排序比b靠后。

相关文章

综述

这个函数比较小众化,官方态度也不是很明确。大概思路上就是,负数表示考前,零表示相同,正数表示靠后,就可以了。至于更多的事情,这个就不是我们所需要考虑的了。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   js