เปรียบเทียบ 2 สตริงตามตัวอักษรเพื่อวัตถุประสงค์ในการจัดเรียง


107

ฉันกำลังพยายามเปรียบเทียบ 2 สตริงตามตัวอักษรเพื่อจุดประสงค์ในการเรียงลำดับ if('aaaa' < 'ab')ยกตัวอย่างเช่นผมต้องการที่จะมีการตรวจสอบเช่นบูล ฉันลองแล้ว แต่มันไม่ได้ผลลัพธ์ที่ถูกต้องดังนั้นฉันเดาว่านั่นไม่ใช่ไวยากรณ์ที่ถูกต้อง ฉันจะทำสิ่งนี้ใน jquery หรือ Javascript ได้อย่างไร


2
คุณเคยเห็นstackoverflow.com/questions/1134976/…หรือไม่?
j08691

นั่นคือวิธีที่คุณทำ คุณคาดหวังผลลัพธ์อะไร การแสดงออกผลตอบแทน'aaaa' < 'ab' true<! - แก้ไขเท็จเพื่อลบคะแนนเสียง ->
Guffa

คำตอบ:


124

มาดูกรณีทดสอบกันบ้าง - ลองเรียกใช้นิพจน์ต่อไปนี้ในคอนโซล JS ของคุณ:

"a" < "b"

"aa" < "ab"

"aaa" < "aab"

ทั้งหมดกลับจริง

JavaScript เปรียบเทียบอักขระสตริงตามอักขระและ "a" มาก่อน "b" ในตัวอักษรดังนั้นจึงน้อยกว่า

ในกรณีของคุณมันใช้งานได้ -

1. " AAA" < " ข"

เปรียบเทียบอักขระ "a" สองตัวแรก - เท่ากันทั้งหมดให้ย้ายไปยังอักขระถัดไป

2. "a AA" <ที่ " "

เปรียบเทียบอักขระที่สอง "a" กับ "b" - โห่! "a" มาก่อน "b" คืนค่าจริง


2
สำหรับการสนทนาเกี่ยวกับอักขระพิเศษเช่นČ, č, Š, š, Ž, žโปรดดูที่stackoverflow.com/questions/6909126/…
dsdsdsdsd

4
น่าประทับใจที่มีอยู่ในตัว!
Slava Knyazev

11
สิ่งที่ควรคำนึงถึงคือเมืองหลวง "a" < "b" === true "a" < "B" === false.
Ted van Riel

143

คุณบอกว่าการเปรียบเทียบมีไว้เพื่อวัตถุประสงค์ในการจัดเรียง จากนั้นฉันขอแนะนำแทน:

"a".localeCompare("b");

มันกลับ-1ตั้งแต่"a" < "b", 1หรือ0มิฉะนั้นเหมือนที่คุณต้องการสำหรับArray.prototype.sort ()

โปรดทราบว่าการเรียงลำดับขึ้นอยู่กับสถานที่ เช่นในภาษาเยอรมันäเป็นตัวแปรของaดังนั้นผลตอบแทน"ä".localeCompare("b", "de-DE") -1ในสวีเดนäเป็นหนึ่งในตัวสุดท้ายในตัวอักษรเพื่อให้ผลตอบแทน"ä".localeCompare("b", "se-SE")1

หากไม่มีพารามิเตอร์ที่สองlocaleCompareเป็นภาษาของเบราว์เซอร์จะถูกใช้ ซึ่งจากประสบการณ์ของฉันไม่เคยเป็นสิ่งที่ฉันต้องการเพราะมันจะเรียงลำดับแตกต่างจากเซิร์ฟเวอร์ซึ่งมีโลแคลที่แน่นอนสำหรับผู้ใช้ทั้งหมด


6
+1 ควรค่าแก่การกล่าวถึงว่าใช้ได้กับกรณีเช่นกัน ( "aa".localeCompare("ab")== "aa" .localeCompare ("Ab") สำหรับภาษาใด ๆ ที่ฉันนึกออก) และใช้งานได้แม้ใน IE เวอร์ชันเก่า น่าจะเป็นคำตอบที่ยอมรับ!
user56reinstatemonica8

1
+1 สำหรับปีเตอร์; สิ่งนี้เข้ากันได้กับวิธีการจัดเรียงอาร์เรย์ Javascript มากกว่าดังนั้นจึงมีประโยชน์มากกว่าและฉันคิดว่ามันเป็นสิ่งที่ OP ขอมากกว่า
Grandclosing

ฉันคิดว่านี่น่าจะเป็นคำตอบที่ถูกต้อง วิธีเดียวในการเปรียบเทียบสตริงตามตัวอักษร ( ไม่ใช่ Unicode )
Limbo

ดูเหมือนจะเป็นเคล็ดลับจริงๆแม้จะเป็นค่าตัวอักษรและตัวเลขก็ตาม ขอบคุณ.
Joshua Pinter

30

เพียงจำไว้ว่าการเปรียบเทียบสตริงเช่น "x"> "X" นั้นคำนึงถึงตัวพิมพ์เล็กและใหญ่

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

คุณสามารถใช้.toLowerCase()เปรียบเทียบได้โดยไม่ต้องคำนึงถึงขนาดตัวพิมพ์


8

"a".localeCompare("b")ควรจะกลับมา-1ตั้งแต่aก่อนหน้านี้b

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


1
หากคุณหมายถึงสิ่งนี้เป็นความคิดเห็นสำหรับคำตอบของฉันคุณพูดถูก คำตอบของฉันเคยแสดงผลลัพธ์เป็น 1 ไม่ถูกต้องดังนั้นฉันจึงแก้ไขสิ่งนั้น
Peter V. Mørch

3

สมมติว่าเรามีอาร์เรย์ของวัตถุ:

{ name : String }

จากนั้นเราสามารถจัดเรียงอาร์เรย์ของเราได้ดังนี้:

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

หมายเหตุ: โปรดใช้ความระมัดระวังสำหรับตัวอักษรบนคุณอาจต้องหล่อสตริงของคุณเป็นตัวพิมพ์เล็กเนื่องจากวัตถุประสงค์ของคุณ


ฟังก์ชันที่ใช้ในการเรียงลำดับควรจะคืนค่า 0 หากมีค่าเท่ากัน ฟังก์ชันนี้จะคืนค่า -1 หรือ 1 เท่านั้น
สตีฟ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.