¿Alguien puede verificar esto por mí? JavaScript no tiene una versión de strcmp(), por lo que tiene que escribir algo como:¿Hay un strcmp de JavaScript()?
(str1 < str2) ?
-1 :
(str1 > str2 ? 1 : 0);
¿Alguien puede verificar esto por mí? JavaScript no tiene una versión de strcmp(), por lo que tiene que escribir algo como:¿Hay un strcmp de JavaScript()?
(str1 < str2) ?
-1 :
(str1 > str2 ? 1 : 0);
Javascript no lo tiene, como usted señala.
Una búsqueda rápida se le ocurrió:
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, usted podría añadir 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 el uso de str1.localeCompare(str2)
todas partes, sin tener que Preocuparse si el navegador local se ha enviado con él. El único problema es que tendría que agregar soporte para locales
and options
si eso le importa.
Creo que esta es una buena forma de manejarlo (detección de características y FTW de relleno), pero si el rendimiento de la micro velocidad es tan importante, como para la necesidad de este método, entonces estoy un poco desconcertado de que se use '==' y no '===' ya que este último evita la conversión de tipo y, por lo tanto, es ese micro segundo más rápido. – Tokimon
¿Qué hay de
str1.localeCompare(str2)
localeCompare() se veía bien, pero parecía que solo era MS, o no en el estándar en el mejor de los casos. –
¿qué estándar estás mirando? parece estar en la sección 15.5.4.9 de la norma ECMA-262, así como en la referencia de Javascript de mozilla (https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String#Methods_unrelated_to_HTML) – newacct
newacct es absolutamente correcto . Esto parece ser el estándar ECMAScript. Probablemente la mejor solución en este caso. – coderjoe
¿Qué tal:
String.prototype.strcmp = function(s) {
if (this < s) return -1;
if (this > s) return 1;
return 0;
}
Entonces, para comparar S1 con 2:
s1.strcmp(s2)
Ayudaría si dijera por qué no deberían hacer lo que hicieron. Pude entender si estaban alterando el funcionamiento de un método de función existente, pero en este caso están agregando uno nuevo. – Puzbie
localeCompare()
is slow, por lo que si no se preocupan por el " Corrija el "orden de cadenas de caracteres que no sean 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.
El +
asegura que la respuesta sea siempre numérica en lugar de booleana.
dos errores: no devuelve 0 para cadena1 == cadena2, no devuelve 1 para cadena1> str2 – stackunderflow
@stackunderflow ¿Qué está sugiriendo que vuelve en esos casos? –
@ 1" I sugieren que debería ser útil como un comparefun en [Array.prototype.sort] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.11), pero en realidad los valores no tienen que ser 1 y -1, solo negativo o positivo como acabo de releer la norma. – stackunderflow
probar este más compacto y fácil de entender comunicado
(a>b)-(a<b)
Es aprox. 50% más lento que
(a<b)?-1:((a>b)?1:0)
No está solo - [otras personas lo han hecho antes] (http://phpjs.org/functions/strcmp:533). El proyecto [PHP.JS] (http://phpjs.org/) en realidad lo ha hecho para muchas otras funciones comunes, también. Es un recurso útil. –