JavaScript strcmp()はありますか?


127

誰でもこれを確認できますか?JavaScriptにはstrcmp()のバージョンがないため、次のように書き出す必要があります。

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

あなたは一人ではありません- 他の人が以前にこれを行ったことがあります。PHP.JSプロジェクトは、実際にも、他の多くの一般的な機能のためにこれを行っています。便利なリソースです。
リードコプシー、

回答:


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 2009

3
localeCompare()ブラウザーによって動作が異なる場合があります。
VardaElentári2016年

1
@VardaElentári:特定のロケールで字句の順序を持​​たない文字のみ。文字のために行うと、彼らが使用したUnicodeのどの部分を制限していないブラウザで、結果は一貫しているECMA-402とUnicodeで定義されます
TJクラウダー2017

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)、ローカルブラウザに同梱されているかどうかを心配することなく、どこでも使用できます。唯一の問題は、サポートを追加する必要がlocalesあり、optionsそれを気にかける場合です。


私はこれが(ポリフィルFTW特徴検出をして)、それを処理する良い方法だと思いますが、マイクロ速度性能は、この方法の必要性に関しては、非常に重要であるならば、私は少し困惑しています==使用していません===後者避けるため、型変換なので、マイクロ秒単位で高速になります。

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()私のマシンよりも桁違いに速いです。

+答えは常に数値ではなく、ブール値であることを保証します。


2つのバグ:str1 == str2に対して0を返さず、str1> str2に対して1を返さない
stackunderflow

2
@stackunderflow私はそれをソート関数でうまく使用しています。発生しているバグは何ですか?
1

1
これは、-1、0、または1ではなく、-1、false、またはtrueを返します。常に数値を返すようにするには、次のように調整します。str1 <str2?-1:+(str1> str2)
jfren484

2
もう1つ(私は今書いているコードでこれを使用しているので、それを完成させてきました):これは大文字と小文字を区別する比較であることを認識してください( 'Foo'は 'bar'の前に来ますが ' Bar」は「foo」の後に表示されます)。これは、strcmpに関するOPの質問に対応しますが、多くの人がケースに依存しない比較を求めてここに来ます。
jfren484

5
ここでもきれいに見える表現があります:(str1 > str2) - (str1 < str2)
ジョナサン・ギルバート

2
var strcmp = new Intl.Collator(undefined, {numeric:true, sensitivity:'base'}).compare;

使用法: strcmp(string1, string2)

結果:1string1が大きい、0等しい、-1string2が大きい、という意味です。

これはより高いパフォーマンスを持っています String.prototype.localeCompare

また、numeric:true論理番号の比較を行います


jsperfの結果の一部を次に示します。jsperf.com/ localecompare
Colin D

-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
このようにプロトタイプを無条件に拡張することは、一般的に大きな問題です。
クリストファー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.