是否有JavaScript strcmp()?


Answers:


134

关于什么

str1.localeCompare(str2)

localeCompare()看起来不错,但是看起来它只是纯MS的,或者最好不是标准的。

10
您在看什么标准?它似乎在ECMA-262标准第15.5.4.9节以及mozilla Javascript参考(developer.mozilla.org/en/Core_JavaScript_1.5_Reference/…)中
newacct

newacct是绝对正确的。这似乎是ECMAScript标准。在这种情况下可能是最好的解决方案。
coderjoe

3
localeCompare()有时在每个浏览器上的行为都不同。
VardaElentári16年

1
@VardaElentári:仅适用于在给定语言环境中没有词汇顺序的字符。对于字符不限制他们使用什么零件的Unicode和浏览器,结果是一致的,由ECMA-402和Unicode定义
TJ Crowder

38

正如您所指出的,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则必须添加支持。


我认为这是把它处理(特征检测和填充工具FTW)一个很好的方式,但如果微速度性能是非常重要的,而对于需要这种方法的,然后我有点疑惑的是==使用,而不是===因为后者避免类型转换,因此是微秒级的速度。
Tokimon 2014年

关于polyfill的说明-localeCompare不区分大小写,因此要使polyfill也不区分大小写,您可以执行以下操作 var a = this.toUpperCase(); var b = str.toUpperCase(); return ((a == b) ? 0 : ((a > b) ? 1 : -1));
Kip

22

localeCompare()速度很慢,因此,如果您不关心非英语字符字符串的“正确”排序,请尝试使用原始方法或看上去更简洁的方法:

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

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

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


两个错误:str1 == str2不返回0,str1> str2不返回1
stackunderflow 2013年

2
@stackunderflow我正在排序功能中成功使用它。您遇到的错误是什么?
1英寸

1
这将返回-1,false或true,而不是-1、0或1。要使其始终返回数字,请进行如下调整:str1 <str2?-1:+(str1> str2)
jfren484 '16

2
还有一件事(我正在立即编写的代码中使用此代码,因此我一直在完善它):请注意,这是区分大小写的比较(“ Foo”将出现在“ bar”之前,但是“ Bar”将在“ foo”之后。)这与OP有关strcmp的问题相对应,但是许多人可能会来这里寻求与案例无关的比较。
jfren484 '16

5
这是一个看起来更干净的表达方式:(str1 > str2) - (str1 < str2)
Jonathan Gilbert


-1

怎么样:

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

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

s1.strcmp(s2)

1
如果您说了为什么他们不应该做他们所做的事情,那将会有所帮助。我能理解他们是否正在改变现有函数方法的工作方式,但是在这种情况下,他们正在添加新方法。
放松在塞浦路斯,2014年

2
像这样无条件地扩展原型通常是很大的禁忌。
克里斯托弗·
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.