Czy ktoś może to dla mnie zweryfikować? JavaScript nie ma wersji strcmp (), więc musisz napisać coś takiego:
( str1 < str2 ) ?
-1 :
( str1 > str2 ? 1 : 0 );
javascript
string
strcmp
Karel Bílek
źródło
źródło
Odpowiedzi:
Co powiesz na
źródło
localeCompare()
czasami zachowuje się inaczej w każdej przeglądarce.Jak zauważyłeś, JavaScript go nie ma.
Pojawiło się szybkie wyszukiwanie:
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 w razie potrzeby możesz po prostu dodać localeCompare:
if (typeof(String.prototype.localeCompare) === 'undefined') { String.prototype.localeCompare = function(str, locale, options) { return ((this == str) ? 0 : ((this > str) ? 1 : -1)); }; }
Używaj
str1.localeCompare(str2)
wszędzie, bez martwienia się, czy lokalna przeglądarka została dostarczona z nią. Jedynym problemem jest to, że musiałbyś dodać obsługęlocales
ioptions
czy ci na tym zależy.źródło
==
jest używany, a nie===
skoro ten ostatni omija konwersja typu, a tym samym jest o mikro sekundę szybciej.var a = this.toUpperCase(); var b = str.toUpperCase(); return ((a == b) ? 0 : ((a > b) ? 1 : -1));
localeCompare()
jest powolny , więc jeśli nie zależy Ci na „prawidłowej” kolejności ciągów znaków innych niż angielskie, wypróbuj swoją oryginalną metodę lub bardziej przejrzystą:str1 < str2 ? -1 : +(str1 > str2)
To o rząd wielkości szybciej niż
localeCompare()
na moim komputerze.W
+
gwarantuje, że odpowiedź jest zawsze numerycznej zamiast logiczna.źródło
(str1 > str2) - (str1 < str2)
var strcmp = new Intl.Collator(undefined, {numeric:true, sensitivity:'base'}).compare;
Stosowanie:
strcmp(string1, string2)
Wynik:
1
oznacza, że ciąg1 jest większy,0
oznacza równy,-1
oznacza , że ciąg2 jest większy.Ma to wyższą wydajność niż
String.prototype.localeCompare
Ponadto
numeric:true
umożliwia logiczne porównywanie liczbźródło
Co powiesz na:
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:
źródło