【问题标题】:comparing 2 strings alphabetically for sorting purposes按字母顺序比较 2 个字符串以进行排序
【发布时间】:2012-04-29 04:58:39
【问题描述】:

我正在尝试按字母顺序比较 2 个字符串以进行排序。例如,我想要一个像if('aaaa' < 'ab') 这样的布尔检查。我试过了,但它没有给我正确的结果,所以我猜这不是正确的语法。我如何在 jquery 或 Javascript 中做到这一点?

【问题讨论】:

标签: javascript jquery


【解决方案1】:

您确实说比较是为了排序。然后我建议改为localeCompare:

"a".localeCompare("b");

它返回-1,因为"a" < "b"、1 或0 否则,就像你需要Array.prototype.sort() 一样

请记住,排序取决于区域设置。例如。在德语中,ä 是a 的变体,所以"ä".localeCompare("b", "de-DE") 返回-1。在瑞典语中,ä 是字母表中的最后一个字母,因此"ä".localeCompare("b", "se-SE") 返回1。

如果没有localeCompare 的第二个参数,则使用浏览器的区域设置。根据我的经验,这绝不是我想要的,因为那样它的排序方式就会与服务器不同,服务器对所有用户都有固定的语言环境。

此外,如果您要排序的内容包含数字,您可能需要:

"a5b".localeCompare("a21b", undefined, { numeric: true })

这将返回 -1,将 5 视为小于 21 的数字。如果没有 { numeric: true },它将返回 1,因为“2”排在“5”之前。在许多实际应用中,用户期望“a5b”出现在“a21b”之前。

【讨论】:

  • +1 还值得一提的是,这也适用于案例("aa".localeCompare("ab") == "aa".localeCompare("Ab") 对于我能想到的任何语言环境),即使在旧版本中也可以使用的IE。应该是公认的答案!
  • +1 给彼得;这与 Javascript 数组排序的工作方式更兼容,因此它更有用,我认为这更多的是 OP 所要求的。
  • 我想,这应该是正确的答案。进行字母(非 Unicode)字符串比较的唯一方法。
  • 这似乎真的可以解决问题,即使对于字母数字值也是如此。谢谢。
【解决方案2】:

让我们看一些测试用例 - 尝试在 JS 控制台中运行以下表达式:

"a" < "b"

"aa" < "ab"

"aaa" < "aab"

全部返回真。

JavaScript 逐个字符地比较字符串,在字母表中“a”在“b”之前——因此小于。

在你的情况下,它是这样工作的 -

1 . "a​aaa" a​b"

比较前两个“a”字符 - 都相等,让我们移到下一个字符。

2 。 "a​a​​aa" b​​"

比较第二个字符“a”和“b”——哇! “a”在“b”之前。返回真。

【讨论】:

  • 有关特殊字符的讨论,例如 Č,č,Š,š,Ž,ž,请参阅 stackoverflow.com/questions/6909126/…
  • 令人印象深刻的是,这是本机内置的!
  • 要记住的是大写字母。 "a" &lt; "b" === true"a" &lt; "B" === false.
  • 是的,它按 asciibetically 排序
  • @chrisjshields - 哇哦 - 我以前从未听过这个词......我喜欢它!
【解决方案3】:

请记住,像 "x" > "X" 这样的字符串比较是区分大小写的

"aa" < "ab" //true
"aa" < "Ab" //false

您可以使用.toLowerCase() 进行不区分大小写的比较。

【讨论】:

    【解决方案4】:

    "a".localeCompare("b") 实际上应该返回-1,因为a 在b 之前排序

    http://www.w3schools.com/jsref/jsref_localecompare.asp

    【讨论】:

    • 如果您的意思是对我的回答发表评论,那么您是对的。我的答案曾经错误地将结果显示为 1,所以我更正了。
    【解决方案5】:

    假设我们有一个对象数组:

    { name : String }
    

    然后我们可以按如下方式对数组进行排序:

    array.sort(function(a, b) {
        var orderBool = a.name > b.name;
        return orderBool ? 1 : -1;
    });
    

    注意:请注意大写字母,由于您的目的,您可能需要将字符串转换为小写。

    【讨论】:

    • 如果它们相等,用于排序的函数应该返回 0。此函数仅返回 -1 或 1。
    • @Steve - 好吧,务实地说,这没关系,因为用户不会有任何改变。也就是说,我同意 - 这不是一个符合规范的比较器,它会导致不必要的相等字符串交换。在小型(或足够独特的)数组上不会引起注意,但在具有大部分相同元素的大型集合上会减慢速度。
    猜你喜欢
    • 2013-12-25
    • 2022-01-02
    • 2013-10-22
    • 2018-05-17
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2019-11-04
    相关资源
    最近更新 更多