2010-01-30 8 views
293

मैं एक समारोह जो जावास्क्रिप्ट में तार के द्विआधारी खोज करता है अनुकूलन करने के लिए कोशिश कर रहा हूँ।जावास्क्रिप्ट में स्ट्रिंग की तुलना करने का सबसे अच्छा तरीका?

द्विआधारी खोज जानना आवश्यक है कि कुंजी == धुरी या < धुरी है की आवश्यकता है।

लेकिन इस भाषाओं जो strcmp() समारोह है कि के लिए तीन मूल्यों (-1, 0, +1) रिटर्न (से बराबर, कम, से अधिक) है की तरह जावास्क्रिप्ट में दो स्ट्रिंग तुलना, C के विपरीत की आवश्यकता है।

वहाँ जावास्क्रिप्ट में इस तरह के एक देशी समारोह, कि एक त्रिगुट मूल्य लौट सकते हैं ताकि सिर्फ एक तुलना द्विआधारी खोज के प्रत्येक चरण में आवश्यक है है?

+5

'वापसी str1

तो यह है कि एक ही समारोह करता है हो सकता है? -1: str1> str2; '? –

+1

@ 1 "यह इष्टतम नहीं है,। (!) दो स्ट्रिंग तुलना की आवश्यकता है – HRJ

+3

यह अभी भी, परिमाण' localeCompare() 'मेरी मशीन पर की तुलना में तेजी का आदेश है @ Gumbo के कस्टम' strcmp() 'तेजी से हो सकता है कि कैसे अनुकूलित पर निर्भर करता है। तारों के लिए समानता तुलनाओं का आंतरिक कार्यान्वयन है। –

उत्तर

390

आप localeCompare() विधि का उपयोग कर सकते हैं।

string_a.localeCompare(string_b); 

/* Expected Returns: 

0: exact match 

-1: string_a < string_b 

1: string_a > string_b 

*/ 

अतिरिक्त पठन:

+11

दुर्भाग्य से, stringCompare विश्वसनीय नहीं है। ओपेरा, आईई, फ़ायरफ़ॉक्स, क्रोम और सफारी सभी 'dog'.localeCompare (' cat ') के लिए 1 लौटाएं, जो और -1 जब आप कॉलर और तर्क को उलट देते हैं। लेकिन बड़े अक्षरों से व्यवहार करते हैं oddly- 'dog'.localeCompare (' कुत्ता ') ब्राउज़रों मैं परीक्षण किया है, केवल सफ़र 4 लौटे का 1. यह रिटर्न -1 IE8 और फ़ायरफ़ॉक्स 3, में और ओपेरा 9 और क्रोम दोनों वापसी +32। – kennebec

+18

जब आप केस असंवेदनशील तुलना चाहते हैं तो आप LowerCase या ToLocaleLowerCase का उपयोग कर सकते हैं। – Fabrice

+2

मुझे लगता है कि यह ध्यान रखना महत्वपूर्ण है कि वी 8 (क्रोम) आईसीएमए -262 को आईई/फ़ायरफ़ॉक्स की तुलना में अलग-अलग कॉम्पैयर पर समझने लगता है। उदाहरण के लिए: "ए" .localeCompare ("Z") -1 वापस आना चाहिए, लेकिन इसके बजाय 7 लौटाता है जो "ए" का चारकोड है - "Z" का charcode। दुर्भाग्यवश, विनिर्देशन में भाषा ढीली है, यह निर्दिष्ट करती है कि localecompare() नकारात्मक संख्या, सकारात्मक संख्या या 0 देता है (विशेष रूप से -1, 1, 0 नहीं)। मैंने आशा में एक बग रिपोर्ट दायर की है कि यह बदल सकता है, लेकिन अगस्त 2010 से यह एक मुद्दा रहा है, इसलिए मुझे संदेह है कि यह होगा। – JoshVarty

11

आप use the comparison operators to compare strings कर सकते हैं। एक strcmp समारोह इस तरह परिभाषित किया जा सकता है:

function strcmp(a, b) { 
    if (a.toString() < b.toString()) return -1; 
    if (a.toString() > b.toString()) return 1; 
    return 0; 
} 

संपादित यहाँ एक स्ट्रिंग तुलना समारोह है कि ज्यादातर मिनट पर ले जाता है {लंबाई (एक), लंबाई ()} तुलना बताने के लिए कैसे दो तार एक दूसरे से संबंधित:

function strcmp(a, b) { 
    a = a.toString(), b = b.toString(); 
    for (var i=0,n=Math.max(a.length, b.length); i<n && a.charAt(i) === b.charAt(i); ++i); 
    if (i === n) return 0; 
    return a.charAt(i) > b.charAt(i) ? -1 : 1; 
} 
+6

लेकिन यह दिनचर्या ठीक वही करता है जो ओपी नहीं करना चाहता: दो स्ट्रिंग तुलनाएं हैं (अकेले उन फ़ंक्शन को कॉल करें " तार")। – Pointy

+0

@ पॉइंट: केवल एक तुलना के साथ यह संभव नहीं है। स्ट्रिंग्स बराबर हैं या नहीं, यह निर्धारित करने के लिए आपको कम से कम न्यूनतम {'a.length',' b.length'} चरणों (एक समय में दो वर्णों की तुलना करें) की आवश्यकता है। (यहां तक ​​कि 'लोकेल कॉम्पारे' भी आंतरिक रूप से ऐसा करेगा।) – Gumbo

+0

नहीं, लोकेल कॉम्पैयर आंतरिक रूप से ऐसा नहीं करेगा। पात्रों की तुलना एक घटाव के रूप में लागू की जाती है, इसलिए जैसे ही उस ऑपरेशन का गैर-शून्य परिणाम होता है, आपको उत्तर पता होता है। आपका उत्तर संभावित रूप से * सभी * प्रत्येक स्ट्रिंग के वर्णों की तुलना कर सकता है। – Pointy

41

जावास्क्रिप्ट में अच्छी तुम इतनी पूर्णांक के रूप में एक ही मान के लिए दो तार की जांच कर सकते यो यह कर सकते हैं:

  • "A" < "B"
  • "A" == "B"
  • "A" > "B"

और इसलिए आप अपने खुद के समारोह है कि जाँच करता है strcmp() के रूप में एक ही तरह से तार कर सकते हैं।

function strcmp(a, b) 
{ 
    return (a<b?-1:(a>b?1:0)); 
} 
+11

फिर, मूल प्रश्न पढ़ें !! बिंदु एक से अधिक स्ट्रिंग तुलना करने से बचने के लिए है। – Pointy

+7

ओह क्षमा करें। यह नहीं देखा ... कम से कम यह किसी के लिए काम करता है। = | – Cipi

+14

आपका मतलब है "ए" == "बी"? – lex82