Есть ли JavaScript strcmp()?

Может ли кто-нибудь проверить это для меня? JavaScript не имеет версии strcmp(), поэтому вам нужно написать что-то вроде:

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

Ответ 1

Что насчет

str1.localeCompare(str2)

Ответ 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 и options, если вам это интересно.

Ответ 3

localeCompare() медленный, поэтому, если вам не нужно "правильное" упорядочение строк, отличных от английского, попробуйте свой оригинальный метод или уборщик вид:

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

Это на порядок быстрее, чем localeCompare() на моей машине.

+ гарантирует, что ответ всегда является числовым, а не логическим.

Ответ 4

Как насчет:

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

Затем, чтобы сравнить s1 с 2:

s1.strcmp(s2)

Ответ 5

Попробуйте это более компактное и понятное выражение

(a>b)-(a<b)

Это ок. 50% медленнее, чем

(a<b)?-1:((a>b)?1:0)

Ответ 6

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

Использование: strcmp(string1, string2)

Результат: 1 означает, что строка1 больше, 0 означает равенство, -1 означает, что -1 больше.

Это имеет более высокую производительность, чем String.prototype.localeCompare

Кроме того, numeric:true делает сравнение логических чисел

Ответ 7

Это дает поведение, которое вы ищете:

function strcmp(str1,str2){
    return str1.localeCompare(str2)/Math.abs(str1.localeCompare(str2));
}