web-dev-qa-db-fra.com

Existe-t-il un strcmp JavaScript ()?

Quelqu'un peut-il vérifier cela pour moi? JavaScript n'a pas de version de strcmp (), vous devez donc écrire quelque chose comme:

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

Qu'en est-il de

str1.localeCompare(str2)
124
newacct

Javascript ne l'a pas, comme tu le fais remarquer.

Une recherche rapide a abouti à:

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/

Bien sûr, vous pouvez simplement ajouter localeCompare si nécessaire:

if (typeof(String.prototype.localeCompare) === 'undefined') {
    String.prototype.localeCompare = function(str, locale, options) {
        return ((this == str) ? 0 : ((this > str) ? 1 : -1));
    };
}

Et utilisez str1.localeCompare(str2) partout, sans avoir à vous soucier de la livraison du navigateur local. Le seul problème est que vous devez ajouter un support pour locales et options si cela vous intéresse.

37
Esteban Küber

localeCompare() est lent , donc si vous ne vous souciez pas de l'ordre "correct" des chaînes de caractères autres que des caractères anglais, essayez votre méthode d'origine ou l'apparence plus propre:

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

C'est un ordre de grandeur plus rapide que localeCompare() sur ma machine.

Le + Garantit que la réponse est toujours numérique plutôt que booléenne.

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

Utilisation: strcmp(string1, string2)

Résultat: 1 Signifie que chaîne1 est plus grand, 0 Signifie égal, -1 Signifie que chaîne2 est plus grande.

Cela a des performances plus élevées que String.prototype.localeCompare

De plus, numeric:true Permet de comparer les nombres logiques.

1
Anonymous

Que diriez-vous:

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

Ensuite, pour comparer s1 avec 2:

s1.strcmp(s2)
0
Panos Papadopoulos