¿Alguien puede verificar esto por mí? JavaScript no tiene una versión de strcmp (), por lo que debe escribir algo como:
( str1 < str2 ) ?
-1 :
( str1 > str2 ? 1 : 0 );
¿Alguien puede verificar esto por mí? JavaScript no tiene una versión de strcmp (), por lo que debe escribir algo como:
( str1 < str2 ) ?
-1 :
( str1 > str2 ? 1 : 0 );
Respuestas:
Qué pasa
str1.localeCompare(str2)
localeCompare()
a veces se comporta de manera diferente en cada navegador.
Javascript no lo tiene, como usted señala.
Se produjo una búsqueda rápida con:
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 ) );
}
de http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_strcmp/
Por supuesto, puede agregar localeCompare si es necesario:
if (typeof(String.prototype.localeCompare) === 'undefined') {
String.prototype.localeCompare = function(str, locale, options) {
return ((this == str) ? 0 : ((this > str) ? 1 : -1));
};
}
Y úselo en str1.localeCompare(str2)
todas partes, sin tener que preocuparse si el navegador local lo envió. El único problema es que tendrías que agregar soporte locales
yoptions
si te importa eso.
==
se use y no ===
porque este último evite tipo de conversión y, por lo tanto, es ese micro segundo más rápido.
var a = this.toUpperCase(); var b = str.toUpperCase(); return ((a == b) ? 0 : ((a > b) ? 1 : -1));
localeCompare()
es lento , por lo que si no le importa el orden "correcto" de las cadenas de caracteres que no están en inglés, pruebe su método original o el aspecto más limpio:
str1 < str2 ? -1 : +(str1 > str2)
Este es un orden de magnitud más rápido que localeCompare()
en mi máquina.
Esto +
asegura que la respuesta sea siempre numérica en lugar de booleana.
(str1 > str2) - (str1 < str2)
var strcmp = new Intl.Collator(undefined, {numeric:true, sensitivity:'base'}).compare;
Uso: strcmp(string1, string2)
Resultado: 1
significa que string1 es más grande, 0
significa igual, -1
significa string2 es más grande.
Esto tiene un rendimiento más alto que String.prototype.localeCompare
Además, numeric:true
hace que haga una comparación lógica de números
Qué tal si:
String.prototype.strcmp = function(s) {
if (this < s) return -1;
if (this > s) return 1;
return 0;
}
Luego, para comparar s1 con 2:
s1.strcmp(s2)