我正在处理如下所示的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
之前出现,以及其他字符串在这里如何排序? 最佳答案
tldr;浏览器特定的实现。最近“标准化”。
在我的答案中,我认为问题不在于JS中的.sort()
数组方法,而是关于.localeCompare()
字符串方法的输出。如果我们转到方法https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare的MDN描述,我们可以找到定义:
以及指向规范的链接:https://www.ecma-international.org/ecma-262/6.0/#sec-string.prototype.localecompare。该规范摘录如下:
您可以找到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
和one of the answers:
当前,使用AFAIK进行比较以使用i18n
Intl API
规范。您可以在规范中找到更多关于比较规则的信息:https://www.ecma-international.org/ecma-402/2.0/#collator-objects。该文档在比较选项上也有此注释:因此,您可以将输出调整到特定水平。我希望这会有所帮助,谢谢:)