web-dev-qa-db-ja.com

JavaScript strcmp()はありますか?

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

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

どう?

str1.localeCompare(str2)
124
newacct

あなたが指摘しているように、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 ) );
}

from 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 のサポートを追加する必要があることです。

37
Esteban Küber

localeCompare()は遅い ですので、英語以外の文字列の「正しい」順序を気にしない場合は、元の方法または見た目をきれいにしてください:

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

これは、私のマシンではlocaleCompare()よりも一桁高速です。

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

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

使用法:strcmp(string1, string2)

結果:1はstring1が大きいことを意味し、0は等しいことを意味し、-1はstring2が大きいことを意味します。

これはString.prototype.localeCompareよりも高いパフォーマンスを発揮します

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

1
Anonymous

どうですか:

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

次に、s1と2を比較するには:

s1.strcmp(s2)
0