【问题标题】:sort array lexicographically in javascript在javascript中按字典顺序对数组进行排序
【发布时间】:2020-08-04 15:17:34
【问题描述】:

为什么会有这段代码

["Q", "fP", "AQ", "L"].sort((a,b) => a.localeCompare(b))

给出这个结果:

["AQ", "fP", "L", "Q"]

我认为它会给我这个(这就是我需要的):

["AQ", "L", "Q", "fP"]

所有大写字母都在小写字母之前chortle.ccsu.edu/java5/Notes/chap92/ch92_2.html

【问题讨论】:

  • 你为什么这么认为?这没有意义。
  • ["Q", "fP", "AQ", "L"].sort() 会给你那个输出
  • @AdamOrlov 所有大写字母都在小写字母之前chortle.ccsu.edu/java5/Notes/chap92/ch92_2.html
  • 你会认为a.localeCompare(b, "en", {sensitivity: 'case', caseFirst: "upper"}) 会起作用......但它不会。
  • @RachidOussanaa — 字典顺序的定义是 Java 特有的,并不普遍使用。字典的排序不是所有单词都以大写字母开头,然后都是小写字母。他们已经存在了几个世纪。碰巧的是,字母字符的 ASCII 代码序列在小写字母之前列出了大写字母。 localeCompare 试图解决这个问题。

标签: javascript


【解决方案1】:

不要使用localeCompare(),直接使用sort()

let myArray = ["Q", "fP", "AQ", "L"];
myArray.sort();
console.log(myArray);

有趣的是,以下在 NodeJS 中有效,但在浏览器 JavaScript 中无效。这是因为 ECMAScript 标准并没有规定要使用哪种排序算法,所以由每个浏览器和/或 NodeJS 来规定

let myArray = ["Q", "fP", "AQ", "L"];
myArray.sort((a, b) => a > b);
console.log(myArray);

NodeJS 演示

https://repl.it/@AnonymousSB/SO53688028

文档

http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.11

【讨论】:

  • 您最后的评论没有意义。 NodeJS 和 JavaScript 基于 ECMAScript,所以内置方法应该是零差异。在我尝试的每个浏览器 ECMAScript 实现中的所有其他字符串之后,您上面的 sn-ps 都使用“fP”排序。此外,(a, b) => a > b 将不会一致地排序,因为它将返回 false (0) where a == b 和 where a < b,而不是分别返回 0 和 -1,这是它应该返回的。
  • 如果比较函数未定义,则应使用内部sortCompare函数,它有效地使用<>,因此使用abstract relational comparison algorithm,它回退到代码单元,所以完全不依赖于实现。 nodejs 演示的排序与浏览器完全一样。
  • 我根本没看到。在您的演示中运行代码排序为[ 'AQ', 'L', 'Q', 'Q', 'fP' ]。 V8 代码中的行使用<> 实现了每个ECMA-262 的排序,它按代码单元排序,而不是按字典顺序(因为ASCII 代码单元不是按字典顺序)。当然`${a} < ${b}`, a > b 应该是`${a} < ${b}`, a < b
  • 因为您的排序功能已损坏,正如我之前所说。只需将其排序为myArray.sort(),结果是一致的。如果您将排序函数修复为return a < b? -1 : a > b? 1 : 0;,您将获得相同的结果,这就是内置排序函数所做的。
【解决方案2】:

试试这个:

let myArray = ["Q", "fP", "AQ", "L"];
myArray.sort((a, b) => a > b ? 1 : -1);
console.log(myArray);

【讨论】:

    【解决方案3】:

    不要使用localeCompare(),直接使用sort()即可。如下:

    ["Q", "fP", "AQ", "L"].sort();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 2013-11-04
      • 2018-10-24
      • 1970-01-01
      • 2015-03-16
      相关资源
      最近更新 更多