【问题标题】:Sorting in localeCompare in javascript在 javascript 中的 localeCompare 中排序
【发布时间】:2019-03-27 05:13:09
【问题描述】:

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

【问题讨论】:

  • 我想这只是字母/Unicode 代码点顺序。通过指定numeric: true"1" < "2" , "10",而不是默认的字母字符串排序,其中"1" < "10" < "2"
  • 它叫做Lexicographical order。我猜; 出现在% 之前,就像a 出现在z 之前。交替的情况也很有趣。以下是一些相关阅读:sitepoint.com/sophisticated-sorting-in-javascript
  • @TylerRoper 不,按代码点,% 先出现(然后是数字),然后是 ;
  • @melpomene 你说得对。
  • 因为默认情况下它们会单独处理标点符号。您可以使用ignorePunctuation 选项来避免它。

标签: javascript sorting collation


【解决方案1】:

tldr;浏览器特定的实现。最近“标准化”了。 在我的回答中,我认为问题不是关于 JS 中的 .sort() 数组方法,而是关于 .localeCompare() 字符串方法的输出。如果我们去MDN描述方法https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare我们可以找到定义:

localeCompare() 方法返回一个数字,指示引用字符串是在排序顺序之前还是之后或与给定字符串相同。

以及规范的链接:https://www.ecma-international.org/ecma-262/6.0/#sec-string.prototype.localecompare。本规范有以下摘录:

当使用参数 that 调用 localeCompare 方法时,它返回一个除 NaN 之外的数字,它表示对 this 值的区域设置敏感字符串比较的结果(用 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”表示变量顶部。

因此您可以将输出调整到特定级别。希望对你有帮助,谢谢:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 2020-09-20
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多