我正在处理如下所示的Javascript代码:
let arr = [
'1 Hello',
'2 Hello',
'3 Hello',
'4 Hello',
';1',
'z',
'%1',
'110 Hello',
'100 Hello',
'a',
'Z',
'00',
'21 Hello',
'9 Hello',
'13 Hello',
'10000 Hello',
'0 Hello',
'A'
];
arr.sort( (a, b) => {
return a.localeCompare(b, 'en', {
numeric: true
})
} ).forEach( ml => { console.log(ml) });
上面的Javascript打印以下o / p:
;1
%1
00
0 Hello
1 Hello
2 Hello
3 Hello
4 Hello
9 Hello
13 Hello
21 Hello
100 Hello
110 Hello
10000 Hello
a
A
z
Z
=> undefined
问题陈述:
我想知道为什么o / p ;1
在%1
之前出现,以及其他字符串在这里如何排序?
答案 0 :(得分:0)
tldr;浏览器特定的实现。最近“标准化”。
在我的回答中,我认为问题不是关于JS中的.sort()
数组方法,而是关于.localeCompare()
字符串方法的输出。如果我们转到方法https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare的MDN描述,我们可以找到定义:
localeCompare()方法返回一个数字,该数字指示参考字符串是按排序顺序位于给定字符串之前还是之后还是与之相同。
以及指向规范的链接:https://www.ecma-international.org/ecma-262/6.0/#sec-string.prototype.localecompare。该规范具有以下摘录:
当使用参数 that 调用localeCompare方法时,它返回一个不同于 NaN 的数字,该数字表示此值的语言环境敏感字符串比较的结果( that (转换为字符串)。这两个字符串是 S 和 That 。 以实现定义的方式比较这两个字符串。结果旨在按主机默认语言环境指定的排序顺序对字符串值进行排序...
您可以找到Chromium的“错误”报告“ localeCompare实现与其他浏览器不同 ”:https://bugs.chromium.org/p/v8/issues/detail?id=459,示例如下:
in v8 version 1.3.13.5, i get these results for the final sort:
A,R,Z,a,q,z,ä,æ
safari produces:
A,a,ä,æ,q,R,Z,z
firefox produces:
a,A,ä,æ,q,R,z,Z
将其标记为功能请求,因为当前实现不违反规范。
当前使用的AFAIK用于比较i18n Intl API
规范。您可以在规范中找到有关比较规则的更多信息:https://www.ecma-international.org/ecma-402/2.0/#collator-objects。该文档在比较选项上也有此注释:
Unicode技术标准35描述了与归类相关的十个语言环境扩展键:“ co”用于归类使用和专业化,“ ka”用于替代处理,“ kb”用于向后第二级权重,“ kc”用于案例级, “ kn”代表数值,“ kh”代表平假名四元数,“ kk”代表标准化,“ kf”代表大小写,“ kr”代表重新排序,“ ks”代表整理强度,“ vt”代表可变顶部。
因此您可以将输出调整到特定水平。我希望这会有所帮助,谢谢:)