在javascript中对localeCompare进行排序

问题描述 投票:5回答:1

我正在处理如下所示的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之前,以及其他字符串在这里如何排序?

javascript sorting collation
1个回答
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之外的数字,该数字表示此值(转换为String)与< [that(转换为字符串)。这两个字符串是SThat这两个字符串以实现定义的方式进行比较。结果旨在按主机默认语言环境指定的排序顺序对字符串值进行排序...

您可以找到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。该文档在比较选项上也有此注释:

Unicode技术标准35描述了与归类相关的十个语言环境扩展键:“ co”用于归类使用和专业化,“ ka”用于替代处理,“ kb”用于后向第二级权重,“ kc”用于案例级,“ “ kn”代表数值,“ kh”代表平假名四元数,“ kk”代表标准化,“ kf”代表大小写,“ kr”代表重新排序,“ ks”代表整理强度,“ vt”代表变量top。

因此您可以将输出调整到特定水平。我希望这会有所帮助,谢谢:)

© www.soinside.com 2019 - 2024. All rights reserved.