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 );
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 );
Réponses:
Qu'en est-il de
str1.localeCompare(str2)
localeCompare()
se comporte parfois différemment sur chaque navigateur.
Javascript ne l'a pas, comme vous le faites remarquer.
Une recherche rapide est venue avec:
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 ) );
}
depuis 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-le str1.localeCompare(str2)
partout, sans vous soucier de savoir si le navigateur local est livré avec. Le seul problème est que vous devrez ajouter un support pour locales
etoptions
si cela vous intéresse.
==
est utilisé et non ===
puisque ce dernier évite conversion de type et est donc cette micro seconde plus rapide.
var a = this.toUpperCase(); var b = str.toUpperCase(); return ((a == b) ? 0 : ((a > b) ? 1 : -1));
localeCompare()
est lent , donc si vous ne vous souciez pas du "bon" ordre des chaînes de caractères non anglais, essayez votre méthode originale ou la 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.
(str1 > str2) - (str1 < str2)
var strcmp = new Intl.Collator(undefined, {numeric:true, sensitivity:'base'}).compare;
Usage: strcmp(string1, string2)
Résultat: 1
signifie que string1 est plus grand, 0
signifie égal, -1
signifie que string2 est plus grand.
Cela a des performances plus élevées que String.prototype.localeCompare
En outre, numeric:true
il fait une comparaison logique des nombres
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)