2009-07-24 7 views
103

¿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); 
+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. –

Respuesta

33

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.

+0

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

106

¿Qué hay de

str1.localeCompare(str2) 
+0

localeCompare() se veía bien, pero parecía que solo era MS, o no en el estándar en el mejor de los casos. –

+8

¿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

+0

newacct es absolutamente correcto . Esto parece ser el estándar ECMAScript. Probablemente la mejor solución en este caso. – coderjoe

3

¿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) 
+0

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

14

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.

+0

dos errores: no devuelve 0 para cadena1 == cadena2, no devuelve 1 para cadena1> str2 – stackunderflow

+0

@stackunderflow ¿Qué está sugiriendo que vuelve en esos casos? –

+0

@ 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

1

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) 
+0

¿Puede vincular una prueba de rendimiento que muestran la diferencia? – Bergi

+0

He probado por mi cuenta ... –

+1

Luego incluya el código que ha utilizado para la prueba para que podamos reproducir sus resultados – Bergi

Cuestiones relacionadas