【问题标题】:Is there a JavaScript strcmp()?有 JavaScript strcmp() 吗?
【发布时间】:2010-11-13 20:12:54
【问题描述】:

谁能帮我验证一下? JavaScript 没有 strcmp() 的版本,所以你必须写出类似的内容:

 ( str1 < str2 ) ? 
            -1 : 
             ( str1 > str2 ? 1 : 0 );

【问题讨论】:

标签: javascript string strcmp


【解决方案1】:

怎么样

str1.localeCompare(str2)

【讨论】:

  • localeCompare() 看起来不错,但它看起来像是仅限 MS,或者充其量不在标准中。
  • 你在看什么标准?它似乎在 ECMA-262 标准第 15.5.4.9 节以及 mozilla Javascript 参考 (developer.mozilla.org/en/Core_JavaScript_1.5_Reference/…) 中
  • newacct 是绝对正确的。这似乎是 ECMAScript 标准。在这种情况下可能是最好的解决方案。
  • localeCompare() 有时在每个浏览器上的行为不同。
  • @VardaElentári:仅适用于在给定语言环境中没有词法顺序的字符。对于的字符和不限制他们使用的Unicode部分的浏览器,结果是一致的并且defined by ECMA-402 and Unicode
【解决方案2】:

正如你所指出的,Javascript 没有它。

快速搜索:

function strcmp ( str1, str2 ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Waldo Malqui Silva
    // +      input by: Steve Hilder
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +    revised by: gorthaur
    // *     example 1: strcmp( 'waldo', 'owald' );
    // *     returns 1: 1
    // *     example 2: strcmp( 'owald', 'waldo' );
    // *     returns 2: -1

    return ( ( str1 == str2 ) ? 0 : ( ( str1 > str2 ) ? 1 : -1 ) );
}

来自http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_strcmp/

当然,如果需要,您可以添加 localeCompare:

if (typeof(String.prototype.localeCompare) === 'undefined') {
    String.prototype.localeCompare = function(str, locale, options) {
        return ((this == str) ? 0 : ((this > str) ? 1 : -1));
    };
}

并在任何地方使用str1.localeCompare(str2),而不必担心本地浏览器是否附带它。唯一的问题是,如果您关心的话,您必须添加对 locales and options 的支持。

【讨论】:

  • 我认为这是一种很好的处理方式(特征检测和polyfill FTW),但是如果微速性能如此重要,至于需要这种方法,那我有点不解使用== 而不是===,因为后者避免了类型转换,因此速度快了微秒。
  • 关于 polyfill 的注释——localeCompare 不区分大小写,因此要使 polyfill 也不区分大小写,您可以执行以下操作 - var a = this.toUpperCase(); var b = str.toUpperCase(); return ((a == b) ? 0 : ((a &gt; b) ? 1 : -1));
【解决方案3】:

localeCompare() is slow,所以如果您不关心非英文字符串的“正确”顺序,请尝试您的原始方法或更简洁的方法:

str1 < str2 ? -1 : +(str1 > str2)

这比我机器上的localeCompare() 快​​一个数量级。

+ 确保答案始终是数字而非布尔值。

【讨论】:

  • 两个错误:str1 == str2 不返回 0,str1 > str2 不返回 1
  • @stackunderflow 我在排序功能中成功使用了它。您遇到的错误是什么?
  • 这将返回 -1、false 或 true 而不是 -1、0 或 1。要让它始终返回数字,请像这样调整它: str1 str2)
  • 还有一件事(我现在正在编写的代码中使用它,所以我一直在完善它):请注意这是区分大小写的比较('Foo'会出现在 'bar' 之前,但 'Bar' 会出现在 'foo' 之后)。这对应于 OP 关于 strcmp 的问题,但很多人可能会来这里寻找与大小写无关的比较。
  • 这是一个看起来更简洁的表达式:(str1 &gt; str2) - (str1 &lt; str2)
【解决方案4】:
var strcmp = new Intl.Collator(undefined, {numeric:true, sensitivity:'base'}).compare;

用法:strcmp(string1, string2)

结果:1 表示 string1 较大,0 表示相等,-1 表示 string2 较大。

这比String.prototype.localeCompare性能更高

另外,numeric:true 可以进行逻辑数字比较

【解决方案5】:

来自这篇How to Check if Two Strings are Equal in JavaScript 文章:

  1. 通常,如果您的字符串仅包含 ASCII 字符,您可以使用 === 运算符来检查它们是否相等。
  2. 但是当您的字符串包含包含组合字符的字符时(例如e + ◌́ = é),您首先要对它们进行标准化,然后再比较相等性,如下所示 - s1.normalize() === s2.normalize()

【讨论】:

    【解决方案6】:

    怎么样:

    String.prototype.strcmp = function(s) {
        if (this < s) return -1;
        if (this > s) return 1;
        return 0;
    }
    

    然后,将 s1 与 2 进行比较:

    s1.strcmp(s2)
    

    【讨论】:

    • 如果你能说出他们为什么不应该做他们所做的事情,那将会有所帮助。我可以理解他们是否正在改变现有函数方法的工作方式,但在这种情况下,他们正在添加一个新方法。
    • 像这样无条件扩展原型通常是一个很大的禁忌。
    猜你喜欢
    • 2018-09-14
    • 2017-01-02
    • 1970-01-01
    • 2019-12-04
    • 2010-12-10
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多