membandingkan 2 string menurut abjad untuk tujuan penyortiran

105

Saya mencoba membandingkan 2 string menurut abjad untuk tujuan penyortiran. Misalnya saya ingin memiliki cek boolean seperti if('aaaa' < 'ab'). Saya mencobanya, tetapi tidak memberikan hasil yang benar, jadi saya rasa itu bukan sintaks yang tepat. Bagaimana saya melakukan ini di jquery atau Javascript?

sebaya
sumber
2
Pernahkah Anda melihat stackoverflow.com/questions/1134976/… ?
j08691
Begitulah cara Anda melakukannya. Hasil apa yang Anda harapkan? Ekspresi 'aaaa' < 'ab'kembali true. <! - edit salah untuk menghapus suara ->
Guffa

Jawaban:

122

Mari kita lihat beberapa kasus pengujian - coba jalankan ekspresi berikut di konsol JS Anda:

"a" < "b"

"aa" < "ab"

"aaa" < "aab"

Semua kembali benar.

JavaScript membandingkan string karakter demi karakter dan "a" muncul sebelum "b" dalam alfabet - karenanya kurang dari.

Dalam kasus Anda, ini berfungsi seperti itu -

1. " A aaa" < " a b"

membandingkan dua karakter "a" pertama - semuanya sama, mari pindah ke karakter berikutnya.

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

membandingkan karakter kedua "a" melawan "b" - teriakan! "a" datang sebelum "b". Mengembalikan nilai true.

Lix
sumber
2
untuk diskusi tentang karakter khusus seperti Č, č, Š, š, Ž, ž, lihat stackoverflow.com/questions/6909126/…
dsdsdsdsd
4
Mengesankan bahwa ini adalah bawaan asli!
Slava Knyazev
11
Sesuatu yang perlu diingat akan menjadi modal. "a" < "b" === true "a" < "B" === false.
Ted van Riel
141

Anda mengatakan bahwa perbandingan itu untuk tujuan penyortiran. Maka saya menyarankan sebagai gantinya:

"a".localeCompare("b");

Ia kembali -1sejak "a" < "b", 1atau 0sebaliknya, seperti yang Anda butuhkan untuk Array.prototype.sort ()

Perlu diingat bahwa pengurutan bergantung pada lokal. Misalnya dalam bahasa Jerman, äadalah varian dari a, jadi "ä".localeCompare("b", "de-DE")kembali -1. Dalam bahasa Swedia, äadalah salah satu huruf terakhir dalam alfabet, sehingga "ä".localeCompare("b", "se-SE")menghasilkan 1.

Tanpa parameter kedua ke localeCompare, lokal browser digunakan. Yang menurut pengalaman saya tidak pernah saya inginkan, karena itu akan diurutkan secara berbeda dari server, yang memiliki lokasi tetap untuk semua pengguna.

Peter V. Mørch
sumber
6
+1 juga perlu disebutkan bahwa ini juga bagus untuk kasus ( "aa".localeCompare("ab")== "aa" .localeCompare ("Ab") untuk lokal mana pun yang dapat saya pikirkan) dan bekerja bahkan di versi lama IE. Seharusnya jawaban yang diterima!
user56reinstatemonica8
1
1 untuk Peter; Ini lebih kompatibel dengan cara kerja penyortiran array Javascript sehingga lebih berguna, dan saya pikir itu lebih dari apa yang diminta OP.
Penutupan
Saya kira, ini seharusnya jawaban yang benar. Satu-satunya cara untuk membuat perbandingan string menurut abjad ( bukan Unicode ).
Limbo
Ini sepertinya benar-benar berhasil, bahkan untuk nilai alfanumerik. Terima kasih.
Joshua Pinter
30

Ingatlah bahwa perbandingan string seperti "x"> "X" peka huruf besar / kecil

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

Anda dapat menggunakan .toLowerCase()untuk membandingkan tanpa sensitivitas huruf besar / kecil.

Sielu
sumber
8

"a".localeCompare("b")harus benar-benar kembali -1sejak amacam sebelumnyab

http://www.w3schools.com/jsref/jsref_localecompare.asp

Shalom Friss
sumber
1
Jika Anda bermaksud ini sebagai komentar untuk jawaban saya, Anda benar. Jawaban saya dulu salah menampilkan hasil sebagai 1, jadi saya mengoreksinya.
Peter V. Mørch
3

Katakanlah kita memiliki array objek:

{ name : String }

maka kita bisa mengurutkan array kita sebagai berikut:

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

Catatan: Hati-hati untuk huruf besar, Anda mungkin perlu mengubah string Anda menjadi huruf kecil karena tujuan Anda.

Eray Xx
sumber
Fungsi yang digunakan untuk menyortir seharusnya mengembalikan 0 jika sama. Fungsi ini hanya mengembalikan -1 atau 1.
Steve