2011-03-16 14 views
5

मेरे पास एक ऐसा फ़ंक्शन है जो असामान्य रूप से पूंजीकृत शब्दों की सूची के लिए पूंजीकरण को सुधारता है:जावास्क्रिप्ट regexp प्रदर्शन।

var line = "some long string of text"; 
["AppleScript", "Bluetooth", "DivX", "FireWire", "GarageBand", 
"iPhone", "iTunes", "iWeb", "iWork", "JavaScript", "jQuery", "MacBook", 
"MySQL", "PowerBook", "PowerPoint", "QuickTime", "TextEdit", "TextMate", 
// ... 
"Wi-Fi", "Xcode", "Xserve", "XMLHttpRequest"].forEach(function(name) { 
     line = line.replace(RegExp(name, "gi"), name); 
}); 

अब जिस समस्या का सामना कर रहा हूं वह यह है कि अधिकांश इनपुट स्ट्रिंग्स औसत शब्दों में 0 और 3 के बीच औसत होंगे। जाहिर है, अब मैं दर्जनों (और संभावित रूप से सैकड़ों कर रहा हूं; उस सरणी में समय के साथ बढ़ने की एक अनोखी प्रवृत्ति है) फ़ंक्शन कॉल की जो अनिवार्य रूप से कुछ भी नहीं करती है।

मैं इस कोड को तेज़ी से कैसे बना सकता हूं और अनावश्यक फ़ंक्शन कॉल से छुटकारा पा सकता हूं?

उदाहरण इनपुट:

मेरा आईफोन एप्लिकेशन UIViewController के तहत एक उपयोगकर्ता प्रपत्र है। जब मैं फिर से आवेदन शुरू करता हूं तो मेरे कुछ यूआईवीव अपनी स्थिति और आकार बदलते हैं। (ये UIViews कीबोर्ड स्थिति पर निर्भर करते हैं) कहीं निश्चित रूप से मेरी गलती है। मैं यह समझने की कोशिश करता हूं कि एप्लिकेशन पृष्ठभूमि से फिर से शुरू होता है और जहां UIView परिवर्तन किए जा सकते हैं।

+0

कॉल असफल नहीं हैं? यदि आप प्रत्येक स्ट्रिंग को कैपिटल बनाना चाहते हैं तो आपको प्रत्येक के लिए जांच करनी होगी ... सिर्फ इसलिए कि यह अस्तित्व में नहीं है इसका मतलब यह नहीं है कि चेक आवश्यक नहीं था ... –

+0

@ सैम लेकिन यह आवश्यक है पूरा इनपुट? या एक स्मार्ट regexp तैयार किया जा सकता है कि एक समारोह कॉल में सभी चेक करेगा? –

+0

ठीक है मैं आपका बिंदु देखता हूं। –

उत्तर

5

आप अपने सभी शब्दों को रेगेक्सपी बना सकते हैं, प्रत्येक शब्द को कोष्ठक में संलग्न करके कैप्चर कर सकते हैं। प्रतिस्थापन में इसका उपयोग प्रतिस्थापन फ़ंक्शन में मूल शब्द को पुनर्प्राप्त करने के लिए पर्याप्त जानकारी प्रदान करेगा।

function correct (text, words) { 
    return text.replace (RegExp ('\\b(?:(' + words.join (')|(') + '))\\b', 'ig'), function (m) { 
     for (var a = arguments.length - 2; a--;) 
     if (arguments[a]) 
     return words[a-1] || m; 
    }); 
    } 

    console.log (correct ("My iphone itunes divx firewire application has a user form under uiviewcontroller. When I start application again some of my uiview changes its positions and sizes. (These uiviews depend on keyboard position) Somewhere is definitely my fault. I try to figure what is going on when application starts again from background and where the uiview changes can be done.", 
    ["AppleScript", "Bluetooth", "DivX", "FireWire", "GarageBand", 
"iPhone", "iTunes", "iWeb", "iWork", "JavaScript", "jQuery", "MacBook", 
"MySQL", "PowerBook", "PowerPoint", "QuickTime", "TextEdit", "TextMate", 
// ... 
"UIViewController","UIView", 
"Wi-Fi", "Xcode", "Xserve", "XMLHttpRequest"])); 
My iPhone iTunes DivX FireWire application has a user form under UIViewController. When I start application again some of my UIView changes its positions and sizes. (These UIViews depend on keyboard position) Somewhere is definitely my fault. I try to figure what is going on when application starts again from background and where the UIView changes can be done. 

This turns out to be faster then the original code

+0

अब यह तेज़ होगा तो मेरे पास अब कोड होगा? क्यूं कर? –

+0

फ़ंक्शन कॉल की संख्या 2 + (number_of_words_replaced) है। शेष भारी उठाने तेजी से आंतरिक कार्यों द्वारा किया जाता है। यदि शब्द सरणी स्थिर है – HBP

+1

regexp को थोड़ा संशोधित करने की आवश्यकता है क्योंकि यह शब्दों के भीतर मेल खाता है: 'RegExp (' \\ b (? :('+ words.join (') | (') +')) \\ बी ',' ig ')' चाल है। –

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