2011-03-30 11 views
15

मुझे एक ऐसा फ़ंक्शन लिखना है जो एक चरित्र लेता है (यानी लंबाई 1 की एक स्ट्रिंग) और यदि यह स्वर है, तो गलत साबित होता है। मैं दो कार्यों के साथ आया, लेकिन यह नहीं पता कि कौन सा बेहतर प्रदर्शन कर रहा है और मुझे किस तरह से पसंद करना चाहिए। RegEx वाला एक तरीका आसान है लेकिन मुझे यकीन नहीं है कि मुझे RegEx का उपयोग करने से बचने की कोशिश करनी चाहिए या नहीं?मैं जावास्क्रिप्ट में स्वरों की जांच कैसे करूं?

रेगुलर एक्सप्रेशन से बिना मेरा प्रयास:

function isVowel(char) 
{ 
    if (char.length == 1) 
    { 
    var vowels = new Array('a','e','i','o','u'); 
    var isVowel = false; 

    for(e in vowels) 
    { 
     if(vowels[e] == char) 
     { 
     isVowel = true; 
     } 
    } 

    return isVowel; 
    } 
} 
RegEx के साथ

:

function isVowelRegEx(char) 
{ 
    if (char.length == 1) 
    { 
    return /[aeiou]/.test(char); 
    } 
} 
+2

जिज्ञासा से बाहर - स्ट्रिंग की लंबाई 1 नहीं होने पर आपके कार्य को वापस करने के लिए क्या करना चाहिए? –

+2

[बेंचमार्क] (http://jsperf.com/regex-vs-for-loop) – Raynos

+3

मुझे यकीन नहीं है कि संदर्भ क्या है, लेकिन आपको विभिन्न भाषाओं से निपटने में समस्या होगी। उदाहरण के लिए आप "ë" पत्र का इलाज कैसे करेंगे उदाहरण के लिए ज़ोए? यह अभी भी एक स्वर है भले ही यह अस्तित्व में है। क्या आप अधिक जानकारी दे सकते हैं? – T9b

उत्तर

1
function isVowel(char) 
{ 
    if (char.length == 1) 
    { 
    var vowels = "aeiou"; 
    var isVowel = vowels.indexOf(char) >= 0 ? true : false; 

    return isVowel; 
    } 
} 

मूल रूप से यह स्वर की स्ट्रिंग में चरित्र के सूचकांक के लिए जाँच करता है। यदि यह एक व्यंजन है, और स्ट्रिंग में नहीं, indexOf वापस आ जाएगा -1।

+0

क्या होगा यदि 'char.length! = 1'? –

+0

@TheEliteGentleman फिर 'अपरिभाषित 'वापस लौटाया गया है – Raynos

+0

@ रेयानोस, कोई तर्क दे सकता है, क्या यह अनिर्धारित' वापस लौटना आवश्यक है? –

35

benchmark

मैं आप सुरक्षित रूप से कह सकते हैं पाश के लिए एक तेजी से होता है लगता है।

मैं मानता हूं कि कोड के संदर्भ में एक regexp क्लीनर दिखता है। यदि यह एक असली टोंटी फिर "शान" के कारणों के लिए नियमित अभिव्यक्ति के साथ चिपके रहते हैं, पाश के लिए एक का उपयोग नहीं तो है

आप सादगी के लिए जाने के लिए चाहते हैं, तो बस

function isVowel(c) { 
    return ['a', 'e', 'i', 'o', 'u'].indexOf(c.toLowerCase()) !== -1 
} 
+1

फ़ायरफ़ॉक्स 4 इंडेक्सऑफ() सबसे तेज़ है। परीक्षण के लिए बीटीडब्ल्यू, ठंडा बेंचमार्क साइट !! – Max

+0

@ मैक्स दिलचस्प है कि कैसे फ़ायरफ़ॉक्स स्ट्रिंग पर इंडेक्स अनुकूलित करता है। – Raynos

+1

[यह एक स्पष्ट 'if' कथन है जो 'char ===' a 'की जांच करता है, अभी तक बहुत तेज है। char === 'e'' आदि] (http://jsperf.com/regex-vs-for-loop/2) - फ़ायरफ़ॉक्स में नहीं छोड़कर व्हाओ !! – Pointy

2

निजी तौर पर इस्तेमाल करते हैं, मैं इसे परिभाषित करेगा इस तरह से:

function isVowel(chr){ return 'aeiou'.indexOf(chr[0].toLowerCase()) !== -1 } 

तुम भी ['a','e','i','o','u'] इस्तेमाल कर सकते हैं और लंबाई परीक्षण को छोड़, लेकिन फिर आप एक सरणी हर बार जब आप फ़ंक्शन को कॉल बना रहे हैं। (वहाँ बंद के माध्यम से इस नकल उतार के तरीके हैं, लेकिन उन थोड़ा अस्पष्ट पढ़ने के लिए कर रहे हैं)

+1

नियमित अभिव्यक्ति अच्छी है और उल्लेखनीय रूप से धीमी नहीं है '/ [aeiou] /। text (chr.toLowerCase()) ' – Raynos

1

यह एक किसी न किसी रेगुलर एक्सप्रेशन समारोह के साथ मैं (यह अपरीक्षित है) आए हैं जाएगा

function isVowel(char) { 
    return /^[aeiou]$/.test(char.toLowerCase()); 
} 

जिसका मतलब है, if (char.length == 1 && 'aeiou' is contained in char.toLowerCase()) then return true है ।

6

चक्र, सरणी, regexp ... क्या के लिए? यह बहुत जल्दी हो सकता है :)

function isVowel(char) 
{ 
    return char === 'a' || char === 'e' || char === 'i' || char === 'o' || char === 'u' || false; 
} 
+0

यदि कोई स्ट्रिंग है तो यह टूट जाएगा। –

+0

अगर char.length> 1 है तो यह झूठी वापसी करेगा और मुझे लगता है कि यह सही है – Emmerman

+0

... और सुपर फास्ट :) – Max

10

खोया यहाँ उत्तरों की, गति इतनी छोटी कार्यों के लिए अप्रासंगिक है जब तक कि आप समय की एक छोटी सी अवधि में उन्हें कुछ सौ हजार बार बुला रहे हैं। मेरे लिए, एक रेगुलर एक्सप्रेशन सबसे अच्छा है, लेकिन एक बंद में रखने ताकि आप इसे हर बार का निर्माण नहीं है:

सरल संस्करण:

function vowelTest(s) { 
    return (/^[aeiou]$/i).test(s); 
} 

अधिक कुशल संस्करण:

var vowelTest = (function() { 
    var re = /^[aeiou]$/i; 
    return function(s) { 
    return re.test(s); 
    } 
})(); 

true देता है यदि s अन्य सभी चीज़ों के लिए एक एकल स्वर (ऊपरी या निचला मामला) और false है।

+0

क्या आप अधिक कुशल संस्करण पर विस्तृत जानकारी दे सकते हैं? मैंने इसे चलाया और यह सरल संस्करण की तरह काम करता है लेकिन (1) इसे और अधिक कुशल क्यों माना जाता है? (2) बाहरीतम कोष्ठक क्या इंगित करते हैं? पहले देखो पर मैंने कहा होगा कि यह एक ऐसा फ़ंक्शन है जो एक फ़ंक्शन देता है (बंद (?) फ़ंक्शन (ओं))। बाहरी (...)() कुछ भी बदलो? – thetrystero

+0

मैं इसे अधिक कुशल मानता हूं क्योंकि नियमित अभिव्यक्ति एक बार बनाई जाती है और हर बार बनाए जाने के बजाय पुन: उपयोग की जाती है। संलग्न "()" फ़ंक्शन अभिव्यक्ति में फ़ंक्शन घोषणा को चालू करें ताकि नाम छोड़ा जा सके। यह '! 'से भी शुरू हो सकता है लेकिन समूह में भी अर्थशास्त्र है जो कहता है" यह सब संबंधित है "जबकि"! " ऐसा लगता है कि "कुछ नहीं ..."। पिछला "()" फ़ंक्शन को कॉल करने का कारण बनता है और बंद होने के अंदर या बाहर हो सकता है "), कई अंदर (अर्थशास्त्र फिर से) पसंद करते हैं। – RobG

0
function findVowels(str) { 
    return (str.match(/[aeiou]/ig)||[]); 
} 

findVowels('abracadabra'); // 'aaaaa' 

असल में यह किसी दिए गए स्ट्रिंग में सभी स्वरों को देता है।

संबंधित मुद्दे