2009-07-24 14 views
103

Czy ktoś może to dla mnie zweryfikować? JavaScript nie posiada wersję strcmp(), więc trzeba napisać coś takiego:Czy istnieje JavaScript strcmp()?

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

Nie jesteś sam - [inni ludzie robili to wcześniej] (http://phpjs.org/functions/strcmp:533). Projekt [PHP.JS] (http://phpjs.org/) faktycznie zrobił to również dla wielu innych popularnych funkcji. To poręczny zasób. –

Odpowiedz

33

Javascript nie ma, jak to podkreślić.

Szybkie wyszukiwanie wymyślił:

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)); 
} 

z http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_strcmp/

Oczywiście, można po prostu dodać localeCompare razie potrzeby:

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

I używać str1.localeCompare(str2) wszędzie, bez konieczności martwić się, że lokalna przeglądarka została dostarczona wraz z nim. Jedynym problemem jest to, że jeśli chcesz, musisz dodać obsługę locales and options.

+0

Myślę, że jest to dobry sposób na jego obsługę (wykrywanie cech i polyfill FTW), ale jeśli wydajność micro speed jest tak ważna, jak na potrzeby tej metody, to jestem trochę zdziwiony, że '==' jest używane i nie "===", ponieważ te ostatnie unikają konwersji typu, a zatem jest to mikro sekunda szybciej. – Tokimon

106

Co

str1.localeCompare(str2) 
+0

localeCompare() wyglądało dobrze, ale wyglądało na to, że było tylko MS, lub w najlepszym razie nie w standardzie. –

+8

jakiego standardu szukasz? wydaje się być w standardowej sekcji ECMA-262 15.5.4.9, a także w odnośniku do JavaScript Mozilli (https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String#Methods_unrelated_to_HTML) – newacct

+0

newacct jest absolutnie poprawny . To wydaje się być standardem ECMAScript. Prawdopodobnie najlepsze rozwiązanie w tym przypadku. – coderjoe

3

Jak o:

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

Następnie, aby porównać s1 z 2:

s1.strcmp(s2) 
+0

Pomoże ci, jeśli powiesz, dlaczego nie powinni robić tego, co zrobili. Mogłem zrozumieć, czy zmieniły one działanie istniejącej metody funkcji, ale w tym przypadku dodają nową. – Puzbie

14

localeCompare() is slow, więc jeśli nie dbają o " popraw "zamawianie ciągów znaków nieanglojęzycznych, wypróbuj oryginalną metodę lub wygląd czystszego:

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

To jest o rząd wielkości szybszy niż localeCompare() na moim komputerze.

+ zapewnia, że ​​odpowiedź jest zawsze numeryczna, a nie boolowska.

+0

Dwa błędy: nie zwraca 0 dla str1 == str2, nie zwraca 1 dla str1> str2 – stackunderflow

+0

@stackunderflow Co sugerujesz, że zwraca w tych przypadkach? –

+0

@ 1 "Sugeruję, że powinien być przydatny jako porównywalny w [Array.prototype.sort] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.11), ale w rzeczywistości wartości nie muszą być równe 1 i -1, tylko ujemne lub dodatnie, ponieważ ponownie przeczytałem standard. – stackunderflow

1

Spróbuj bardziej kompaktowy i łatwy do zrozumienia komunikatu

(a>b)-(a<b) 

To jest ok. 50% wolniej niż

(a<b)?-1:((a>b)?1:0) 
+0

Czy możesz połączyć test wydajności, który pokazuje różnicę? – Bergi

+0

Testowałem sam ... –

+1

Następnie proszę podać kod, którego użyłeś do testu, abyśmy mogli odtworzyć twoje wyniki. – Bergi

Powiązane problemy