有 JavaScript strcmp() 吗?

IT技术 javascript string strcmp
2021-01-13 16:27:53

任何人都可以为我验证这一点吗?JavaScript 没有 strcmp() 的版本,因此您必须写出如下内容:

 ( str1 < str2 ) ? 
            -1 : 
             ( str1 > str2 ? 1 : 0 );
6个回答

关于什么

str1.localeCompare(str2)
@VardaElentári:仅适用于在给定语言环境中没有词法排序的字符。对于字符不限制他们使用什么零件的Unicode和浏览器,结果是一致的,由ECMA-402和Unicode定义
2021-03-29 16:27:53
localeCompare() 有时在每个浏览器上的行为不同。
2021-04-01 16:27:53
你在看什么标准?它似乎在 ECMA-262 标准第 15.5.4.9 节以及 mozilla Javascript 参考中(developer.mozilla.org/en/Core_JavaScript_1.5_Reference/...
2021-04-02 16:27:53
localeCompare() 看起来不错,但看起来它只是 MS,或者充其量不在标准中。
2021-04-03 16:27:53
newacct 是绝对正确的。这似乎是 ECMAScript 标准。在这种情况下可能是最好的解决方案。
2021-04-12 16:27:53

正如您所指出的,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)随处使用,无需担心本地浏览器是否随附。唯一的问题是您必须添加支持localesoptions如果您关心的话。

关于 polyfill 的注释--localeCompare 不区分大小写,因此要使 polyfill 也不区分大小写,您可以执行以下操作- var a = this.toUpperCase(); var b = str.toUpperCase(); return ((a == b) ? 0 : ((a > b) ? 1 : -1));
2021-03-30 16:27:53
我认为这是一个很好的处理方式(特征检测和 polyfill FTW),但是如果微速性能如此重要,至于这种方法的需要,那么我有点困惑==是使用而不是===因为后者避免类型转换,因此快了微秒。
2021-04-10 16:27:53

localeCompare()很慢,所以如果您不关心非英文字符串的“正确”排序,请尝试使用原始方法或外观更简洁的方法:

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

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

+保证答案永远是数字,而不是布尔值。

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

用法: strcmp(string1, string2)

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

这比 String.prototype.localeCompare

此外,numeric:true使其进行逻辑数比较

来自这篇如何检查 JavaScript 中的两个字符串是否相等的文章:

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