Sıralama amacıyla 2 dizeyi alfabetik olarak karşılaştırma


105

Sıralama amacıyla 2 dizeyi alfabetik olarak karşılaştırmaya çalışıyorum. Örneğin bir boole kontrolüne sahip olmak istiyorum if('aaaa' < 'ab'). Denedim, ama bana doğru sonuçlar vermiyor, bu yüzden sanırım bu doğru sözdizimi değil. Bunu jquery veya Javascript ile nasıl yaparım?



Bu iş böyle olur. Ne sonucu bekliyorsunuz? İfade 'aaaa' < 'ab'geri döner true. <! - oyu kaldırmak için yanlış düzenleme ->
Guffa

Yanıtlar:


123

Şimdi bazı test durumlarına bakalım - JS konsolunuzda aşağıdaki ifadeleri çalıştırmayı deneyin:

"a" < "b"

"aa" < "ab"

"aaa" < "aab"

Hepsi doğru olur.

JavaScript dizeleri karakter karakter karşılaştırır ve "a" alfabede "b" den önce gelir - dolayısıyla daha az.

Senin durumunda böyle çalışıyor -

1. " Bir aaa" < " a b"

ilk iki "a" karakterini karşılaştırır - hepsi eşit, bir sonraki karaktere geçelim.

2. "Bir a aa" < "a b "

ikinci karakterleri "a" ile "b" yi karşılaştırır - whoop! "a", "b" den önce gelir. True döndürür.


2
Č, č, Š, š, Ž, ž gibi özel karakterler hakkında tartışma için bkz. stackoverflow.com/questions/6909126/…
dsdsdsdsd

4
Bunun yerel olarak yerleşik olması etkileyici!
Slava Knyazev

11
Akılda tutulması gereken bir şey başkentler olacaktır. "a" < "b" === true "a" < "B" === false.
Ted van Riel

141

Karşılaştırmanın sıralama amaçlı olduğunu söylüyorsunuz. O zaman bunun yerine şunu öneririm:

"a".localeCompare("b");

Bu döner -1beri "a" < "b", 1ya 0sizin için ihtiyaç gibi aksi (Array.prototype.sort)

Sıralamanın yerel ayara bağlı olduğunu unutmayın. Örneğin, Almanca'da, äbir varyantıdır a, yani "ä".localeCompare("b", "de-DE")döner -1. İsveççe äalfabedeki son harflerden biridir, bu yüzden "ä".localeCompare("b", "se-SE")döner 1.

İkinci parametre olmadan localeComparetarayıcının yerel ayarı kullanılır. Benim deneyimime göre bu asla istediğim şey değil, çünkü o zaman tüm kullanıcılar için sabit bir yerel ayarı olan sunucudan farklı şekilde sıralanacak.


6
+1 ayrıca bunun vakalar için de iyi olduğunu ( "aa".localeCompare("ab")aklıma gelen herhangi bir yerel ayar için == "aa" .localeCompare ("Ab")) ve IE'nin eski sürümlerinde bile çalıştığını belirtmeye değer . Kabul edilen cevap olmalı!
user56reinstatemonica8

1
Peter için +1; Bu, Javascript dizi sıralamanın nasıl çalıştığıyla daha uyumlu, bu yüzden daha kullanışlı ve bence OP'nin istediği şeyden daha fazlası.
Kapanış

Sanırım bu doğru cevap olmalı. Alfabetik ( Unicode değil ) dizeler karşılaştırması yapmanın tek yolu .
Limbo

Bu, alfasayısal değerler için bile gerçekten işe yarıyor gibi görünüyordu. Teşekkürler.
Joshua Pinter

30

"X"> "X" gibi dize karşılaştırmasının büyük / küçük harfe duyarlı olduğunu unutmayın.

"aa" < "ab" //true
"aa" < "Ab" //false

Büyük / .toLowerCase()küçük harf duyarlılığı olmadan karşılaştırmak için kullanabilirsiniz .



3

Bir dizi nesnemiz olduğunu varsayalım:

{ name : String }

daha sonra dizimizi aşağıdaki gibi sıralayabiliriz:

array.sort(function(a, b) {
    var orderBool = a.name > b.name;
    return orderBool ? 1 : -1;
});

Not: Büyük harflere dikkat edin, amacınız nedeniyle dizinizi küçük harfe çevirmeniz gerekebilir.


Sıralama için kullanılan işlevin, eşitlerse 0 döndürmesi beklenir. Bu işlev yalnızca -1 veya 1'i döndürür.
Steve
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.