JavaScript strcmp () var mı?


Yanıtlar:


134

Ne dersin

str1.localeCompare(str2)

localeCompare () iyi görünüyordu, ancak yalnızca MS ya da en iyi ihtimalle standart değil gibi görünüyordu.

10
hangi standarda bakıyorsun? ECMA-262 standart bölüm 15.5.4.9'da ve mozilla Javascript referansında ( developer.mozilla.org/en/Core_JavaScript_1.5_Reference/… )
newacct

newhesap kesinlikle doğrudur. Bu ECMAScript standardı gibi görünüyor. Muhtemelen bu durumda en iyi çözüm.
coderjoe

3
localeCompare()bazen her tarayıcıda farklı davranır.
Varda Elentári

1
@ VardaElentári: Yalnızca verilen yerel ayarda sözcük sıralaması olmayan karakterler için. Karakterler için yapmak kullandıkları Unicode hangi parçaları kısıtlamak değil ve tarayıcılar, sonuçları tutarlı ve vardır ECMA-402 ve Unicode tarafından tanımlanan .
TJ Crowder

38

Sizin de belirttiğiniz gibi Javascript buna sahip değil.

Hızlı bir arama geldi:

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

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

Elbette, gerekirse localeCompare ekleyebilirsiniz:

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

Ve str1.localeCompare(str2)yerel tarayıcının onunla birlikte gelip gelmediği konusunda endişelenmenize gerek kalmadan her yerde kullanın . Tek sorun, destek eklemeniz gerekmesi localesveoptions bunu önemsiyorsanız.


Bu o (polyfill FTW özellik algılama ve) taşıma güzel bir yolu olduğunu düşünüyorum, ama mikro hız performansı bu yöntemin ihtiyacı için olduğu gibi, bu kadar önemli ise, o zaman ben biraz o şaşkın ==kullanılır ve ===ikincisi kaçınmak beri tür dönüştürme ve dolayısıyla mikro saniye daha hızlıdır.
Tokimon

polyfill ile ilgili bir not - localeCompare büyük / küçük harfe duyarlı değildir, bu nedenle çoklu dolgunun büyük / küçük harfe duyarlı olmaması için var a = this.toUpperCase(); var b = str.toUpperCase(); return ((a == b) ? 0 : ((a > b) ? 1 : -1));
Kip

22

localeCompare()yavaştır , bu nedenle, İngilizce olmayan karakter dizilerinin "doğru" sıralanmasını önemsemiyorsanız, orijinal yönteminizi veya daha net görünen yöntemi deneyin:

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

Bu localeCompare()benim makinemdekinden çok daha hızlı .

+Cevap her zaman sayısal ziyade boole olmasını sağlar.


İki hata: str1 == str2 için 0 döndürmez,
str1

2
@stackunderflow Bir sıralama işlevinde başarıyla kullanıyorum. Yaşadığınız hata nedir?
1 ''

1
Bu -1, 0 veya 1 yerine -1, yanlış veya doğru döndürecektir. Her zaman sayı döndürmesini sağlamak için şu şekilde ince ayar yapın: str1 <str2? -1: + (
str1

2
Bir şey daha (bunu şu anda yazıyorum kodda kullanıyorum, bu yüzden mükemmelleştiriyorum): bunun büyük / küçük harfe duyarlı bir karşılaştırma olduğunun farkında olun ('Foo', 'bar' dan önce gelir ama ' Bar "foo" dan sonra gelir). Bu, OP'nin strcmp hakkındaki sorusuna karşılık gelir, ancak birçok insan buraya gelip bir vaka-agnostik karşılaştırma arayabilir.
jfren484

5
İşte daha net görünen bir ifade:(str1 > str2) - (str1 < str2)
Jonathan Gilbert

2
var strcmp = new Intl.Collator(undefined, {numeric:true, sensitivity:'base'}).compare;

Kullanımı: strcmp(string1, string2)

Sonuç: 1string1'in daha büyük olduğu, 0eşit olduğu -1anlamına gelir, string2'nin daha büyük olduğu anlamına gelir.

Bu, şundan daha yüksek performansa sahiptir: String.prototype.localeCompare

Ayrıca, numeric:truemantıksal sayı karşılaştırması yapmasını sağlar



-1

Peki ya:

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

Ardından s1'i 2 ile karşılaştırmak için:

s1.strcmp(s2)

1
Yaptıklarını neden yapmamaları gerektiğini söylersen yardımcı olur. Mevcut bir işlev yönteminin nasıl çalıştığını değiştirip değiştirmediklerini anlayabilirdim, ancak bu durumda yenisini ekliyorlar.
Kıbrıs'ta Rahatlama

2
Prototipleri koşulsuz olarak bu şekilde genişletmek genellikle büyük bir hayırdır.
Christopher
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.