มี JavaScript strcmp () หรือไม่


127

ใครสามารถยืนยันสิ่งนี้ให้ฉันได้ไหม JavaScript ไม่มีเวอร์ชัน strcmp () ดังนั้นคุณต้องเขียนสิ่งต่างๆเช่น:

 ( str1 < str2 ) ? 
            -1 : 
             ( str1 > str2 ? 1 : 0 );

คุณไม่ได้อยู่คนเดียว - คนอื่น ๆ ได้กระทำเช่นนี้มาก่อน PHP.JS โครงการจริงได้ดำเนินการนี้สำหรับการทำงานร่วมกันอื่น ๆ อีกมากมายเช่นกัน เป็นทรัพยากรที่มีประโยชน์
Reed Copsey

คำตอบ:


134

เกี่ยวกับ

str1.localeCompare(str2)

localeCompare () ดูดี แต่ดูเหมือนว่าเป็น MS เท่านั้นหรือไม่อยู่ในมาตรฐานที่ดีที่สุด

10
คุณดูมาตรฐานอะไร ดูเหมือนว่าจะอยู่ใน ECMA-262 ส่วนมาตรฐาน 15.5.4.9 เช่นเดียวกับในการอ้างอิง Mozilla Javascript (ผู้พัฒนา.
mozilla.org/en/Core_JavaScript_1.5_Reference/…

newacct ถูกต้องแน่นอน ดูเหมือนว่าจะเป็นมาตรฐาน ECMAScript น่าจะเป็นทางออกที่ดีที่สุดในกรณีนี้
coderjoe

3
localeCompare()บางครั้งก็ทำงานแตกต่างกันไปในแต่ละเบราว์เซอร์
Varda Elentári

1
@ VardaElentári: สำหรับอักขระที่ไม่มีการเรียงลำดับคำศัพท์ในภาษาที่กำหนดเท่านั้น สำหรับตัวละครที่ทำและเบราว์เซอร์ที่ไม่ จำกัด สิ่งที่ส่วนของ Unicode ที่พวกเขาใช้ผลที่สอดคล้องกันและกำหนดโดย ECMA-402 และ Unicode
TJ Crowder

38

Javascript ไม่มีอย่างที่คุณชี้ให้เห็น

การค้นหาอย่างรวดเร็วมาพร้อมกับ:

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

จากhttp://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_strcmp/

แน่นอนคุณสามารถเพิ่ม localeCompare ได้หากจำเป็น:

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

และใช้งานได้str1.localeCompare(str2)ทุกที่โดยไม่ต้องกังวลกับเบราว์เซอร์ในเครื่องที่มาพร้อมกับมัน ปัญหาเดียวคือคุณจะต้องเพิ่มการสนับสนุนlocalesและoptionsถ้าคุณสนใจเรื่องนั้น


ฉันคิดว่านี่เป็นวิธีที่ดีในการจัดการมัน (การตรวจจับคุณสมบัติและโพลีฟิลล์ FTW) แต่ถ้าประสิทธิภาพความเร็วระดับไมโครมีความสำคัญเช่นเดียวกับความต้องการของวิธีนี้ฉันก็งงเล็กน้อยที่==ใช้และไม่ได้===หลีกเลี่ยงตั้งแต่หลัง การแปลงประเภทและด้วยเหตุนี้ไมโครวินาทีจึงเร็วขึ้น
Tokimon

หมายเหตุเกี่ยวกับ polyfill - localeCompare ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ดังนั้นเพื่อให้ polyfill ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่คุณอาจทำสิ่งที่ชอบ - var a = this.toUpperCase(); var b = str.toUpperCase(); return ((a == b) ? 0 : ((a > b) ? 1 : -1));
Kip

22

localeCompare()ช้าดังนั้นหากคุณไม่สนใจเกี่ยวกับการเรียงลำดับสตริงที่ไม่ใช่ภาษาอังกฤษที่ "ถูกต้อง" ให้ลองใช้วิธีเดิมของคุณหรือวิธีที่ดูสะอาดตากว่า:

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

นี่คือลำดับความสำคัญที่เร็วกว่าlocaleCompare()บนเครื่องของฉัน

+เพื่อให้แน่ใจว่าคำตอบคือมักจะเป็นตัวเลขมากกว่าบูล


ข้อบกพร่องสองข้อ: ไม่ส่งคืน 0 สำหรับ str1 == str2 ไม่ส่งคืน 1 สำหรับ str1> str2
stackunderflow

2
@stackunderflow ฉันใช้มันสำเร็จในฟังก์ชันการเรียงลำดับ ข้อบกพร่องที่คุณพบคืออะไร?
1 ''

1
สิ่งนี้จะคืนค่า -1 เท็จหรือจริงแทนที่จะเป็น -1, 0 หรือ 1 หากต้องการให้มันส่งคืนตัวเลขเสมอให้ปรับแต่งดังนี้: str1 <str2? -1: + (str1> str2)
jfren484

2
อีกอย่างหนึ่ง (ฉันใช้สิ่งนี้ในโค้ดที่ฉันกำลังเขียนอยู่ตอนนี้ดังนั้นฉันจึงทำให้มันสมบูรณ์แบบ): โปรดทราบว่านี่เป็นการเปรียบเทียบที่คำนึงถึงตัวพิมพ์เล็กและใหญ่ ('Foo' จะมาก่อน 'bar' แต่ ' Bar 'จะมาหลัง' foo ') ซึ่งสอดคล้องกับคำถามของ OP เกี่ยวกับ strcmp แต่หลายคนอาจมาที่นี่เพื่อค้นหาการเปรียบเทียบแบบไม่เชื่อเรื่องพระเจ้า
jfren484

5
นี่เป็นการแสดงออกที่ดูสะอาดตายิ่งขึ้น:(str1 > str2) - (str1 < str2)
Jonathan Gilbert

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

การใช้งาน: strcmp(string1, string2)

ผลลัพธ์: 1หมายความว่า string1 ใหญ่กว่า0หมายถึงเท่ากับ-1หมายถึง string2 ใหญ่กว่า

ซึ่งมีประสิทธิภาพสูงกว่า String.prototype.localeCompare

นอกจากนี้ numeric:trueทำให้ทำการเปรียบเทียบจำนวนตรรกะ



-1

เกี่ยวกับ:

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

จากนั้นเปรียบเทียบ s1 กับ 2:

s1.strcmp(s2)

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

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