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);
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);
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
.
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
Co
str1.localeCompare(str2)
localeCompare() wyglądało dobrze, ale wyglądało na to, że było tylko MS, lub w najlepszym razie nie w standardzie. –
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
newacct jest absolutnie poprawny . To wydaje się być standardem ECMAScript. Prawdopodobnie najlepsze rozwiązanie w tym przypadku. – coderjoe
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)
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
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.
Dwa błędy: nie zwraca 0 dla str1 == str2, nie zwraca 1 dla str1> str2 – stackunderflow
@stackunderflow Co sugerujesz, że zwraca w tych przypadkach? –
@ 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
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)
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. –