क्या कोई जावास्क्रिप्ट स्ट्रैम्प () है?


127

क्या कोई मेरे लिए इसे सत्यापित कर सकता है? JavaScript में strcmp () का संस्करण नहीं है, इसलिए आपको कुछ इस तरह लिखना होगा:

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

आप अकेले नहीं हैं - दूसरे लोग पहले भी ऐसा कर चुके हैंPHP.JS परियोजना वास्तव में कई और सामान्य कार्यों के लिए यह किया गया है, साथ ही। यह एक आसान संसाधन है।
रीड कोपसे जुले

जवाबों:


134

व्हाट अबाउट

str1.localeCompare(str2)

localeCompare () अच्छा लग रहा था, लेकिन ऐसा लग रहा था कि यह एमएस-ओनली है, या मानक में नहीं है।

10
आप किस मानक को देख रहे हैं? यह ECMA-262 मानक खंड 15.5.4.9, साथ ही मोज़िला जावास्क्रिप्ट संदर्भ ( developer.mozilla.org/en/Core_JavaScript_1.5_Reference/… ) में लगता है
newac

newacct बिलकुल सही है। यह ईसीएमएस्क्रिप्ट मानक है। शायद इस मामले में सबसे अच्छा समाधान।
कोडरजॉय

3
localeCompare()कभी-कभी प्रत्येक ब्राउज़र पर अलग तरह से व्यवहार करता है।
वरदा एलेंट्री

1
@ VardaElentári: केवल उन पात्रों के लिए जिन्हें दिए गए लोकेल में कोई शाब्दिक क्रम नहीं है। उन पात्रों के लिए जो करते हैं और ब्राउज़र जो यूनिकोड के कुछ हिस्सों को प्रतिबंधित नहीं करते हैं, परिणाम ECMA-402 और यूनीकोड ​​द्वारा सुसंगत और परिभाषित होते हैं ।
टीजे क्राउडर

38

जावास्क्रिप्ट आपके पास नहीं है, जैसा कि आप बताते हैं।

एक त्वरित खोज के साथ आया:

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), लेकिन अगर माइक्रो गति प्रदर्शन इतना महत्वपूर्ण है, जैसा कि इस पद्धति की आवश्यकता के लिए है, तो मैं थोड़ा हैरान हूं ==जिसका उपयोग किया जाता है और ===बाद वाले से बचने के लिए नहीं प्रकार रूपांतरण और इसलिए यह माइक्रो दूसरा तेजी से है।
टोकिमन

पॉलीफ़िल पर एक नोट-- लोकेलकम्पर केस-सेंसिटिव नहीं है, इसलिए पॉलीफ़िल बनाने के लिए भी केस-सेंसिटिव न होने पर आप कुछ ऐसा कर सकते हैं जैसे var a = this.toUpperCase(); var b = str.toUpperCase(); return ((a == b) ? 0 : ((a > b) ? 1 : -1));
किप

22

localeCompare()यह धीमा है , इसलिए यदि आप गैर-अंग्रेजी-वर्ण स्ट्रिंग्स के "सही" क्रम के बारे में परवाह नहीं करते हैं, तो अपने मूल तरीके या क्लीनर को आज़माएं:

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

यह localeCompare()मेरी मशीन की तुलना में अधिक तीव्रता का क्रम है ।

यह +सुनिश्चित करता है कि उत्तर बूलियन के बजाय हमेशा संख्यात्मक हो।


दो बग: str1 == str2 के लिए 0 नहीं लौटाता, str1> str2 के लिए 1 नहीं लौटाता
stackunderflow

2
@stackunderflow मैं इसे सफलतापूर्वक एक छँटाई समारोह में उपयोग कर रहा हूँ। बग क्या है जो आप अनुभव कर रहे हैं?
1 ''

1
यह -1, 0, या 1. के बजाय -1, गलत, या सही लौटाएगा। इसे हमेशा नंबर वापस करने के लिए, इसे इस तरह से ट्वीक करें: str1 <str2? -1: + (str1> str2)
jfren484

2
एक और बात (मैं इस कोड का उपयोग कर रहा हूं, जो मैं अभी लिख रहा हूं, इसलिए मैं इसे पूरा कर रहा हूं): बस ध्यान रखें कि यह एक केस-संवेदी तुलना है ('फू' 'बार' से पहले आएगी लेकिन ' बार '' फू 'के बाद आएगा)। यह strcmp के बारे में ओपी के प्रश्न से मेल खाता है, लेकिन कई लोग यहां केस-अज्ञेय तुलना की तलाश में आ सकते हैं।
jfren484

5
यहाँ एक साफ- (str1 > str2) - (str1 < str2)
जोनाथन गिल्बर्ट

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

उपयोग: strcmp(string1, string2)

परिणाम: 1string1 बड़ा है, 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;
}

फिर, 2 के साथ s1 की तुलना करने के लिए:

s1.strcmp(s2)

1
यह मदद करेगा यदि आपने कहा कि वे ऐसा क्यों नहीं करते हैं जो उन्होंने किया था। मैं समझ सकता था कि क्या वे बदल रहे थे कि मौजूदा फ़ंक्शन विधि कैसे काम करती है, लेकिन इस मामले में वे एक नया जोड़ रहे हैं।
साइप्रस में आराम

2
इस तरह बिना शर्त के विस्तार करना आम तौर पर एक बड़ी संख्या है।
क्रिस्टोफर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.