2012-12-05 27 views
7

बनाने के बिना कॉफ़ीस्क्रिप्ट में एक स्ट्रिंग पर इटरेट करना मेरे पास मेरे कोड में कई जगहें हैं जहां मुझे एक स्ट्रिंग पर फिर से प्रयास करने और चार द्वारा ऑपरेशन चार करने की आवश्यकता है। मेरे node.js एप्लिकेशन को इस अनुरोध के दर्जनों बार करने की आवश्यकता है और अक्सर तारों की लंबाई काफी लंबी हो सकती है।एक सरणी

एकमात्र तरीका जिसे मैंने नीचे दिए गए जावास्क्रिप्ट को कॉफ़ीस्क्रिप्ट में परिवर्तित करने के लिए देखा है स्ट्रिंग की लंबाई के आधार पर एक सरणी बनाना है। मेरे साथ समस्या यह है कि यह हार्डवेयर पक्ष पर करने के लिए एक अतिरिक्त चीज है, अतिरिक्त मेमोरी लेती है, और केवल अनावश्यक लगती है (मेरे नोड एप्लिकेशन प्रोसेस dgrams - हजारों तक एक सेकंड तक - तो यह सब अतिरिक्त काम जोड़ता है)।

जावास्क्रिप्ट रास्ता:

for(var i = 0; i < str.length; i++) { /* Do stuff with str here */ } 

सुझाव CoffeeScript रास्ता

for i in [0..str.length] 
    # Do stuff here 

फिर से, मुझे लगता है कि पाश नहीं करता है के लिए पारंपरिक जब एक सरणी वस्तु के निर्माण के लिए मजबूर करने की मूर्खतापूर्ण है एक हार्डवेयर परिप्रेक्ष्य से उस कदम के साथ गड़बड़ नहीं है। हालांकि यह काम करता है, कि बस पाश के लिए एक सरल का उपयोग करने का भी सीधे जावास्क्रिप्ट रास्ता तुलना में कहीं अधिक वर्बोज़ है

i = 0 
while i < str.length 
    # Do stuff 
    i++ 

:

मेरी केवल काम के आसपास मैंने पाया, जबकि तरह छोरों का प्रयोग है।

क्या बुनियादी पुनरावृत्तियों को निष्पादित करने के लिए अनावश्यक सरणी उत्पन्न किए बिना कॉफीस्क्रिप्ट में लूप का उपयोग करने का कोई तरीका है?

console.log("Hello world".length);       // returns "11" 
console.log("Hello world"[6]);   // returns "o" 
console.log("Hello world".indexOf("w")); // returns "6" 

मैं तुम्हें उन छोरों में से किसी में सरणियों आरंभ नहीं दिख रहा है: जैसे आप arrays का उपयोग होता

+0

क्यों एक स्ट्रिंग से अधिक पुनरावृति? पहले तरीके से क्या गलत है? – Christoph

+2

@ क्रिस्टोफ क्यों * स्ट्रिंग पर * फिर से नहीं? शायद वह इसे पार्स कर रहा है। – Pointy

+1

आपका मतलब क्या है "बिना अनावश्यक सरणी उत्पन्न किए" _? आप केवल एक स्ट्रिंग का उपयोग कर सकते हैं जैसे कि यह एक सरणी थी: 'console.log (" हैलो वर्ल्ड "[7]);' – Cerbrus

उत्तर

13

यह वास्तव में एक सरणी नहीं बनाता है अगर इसे नहीं करना है। संकलित जेएस देखें। यह CoffeeScript:

var i, str, _i, _ref; 

str = "hello"; 

for (i = _i = 0, _ref = str.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) { 
    alert(i); 
} 

कोई सरणी वास्तव में बनाया गया था:

str = "hello" 
for i in [0..(str.length-1)] 
    alert(i) 

निम्न JavaScript उत्पन्न करता है।

(1 घटाने एक अपरिभाषित से बचने के लिए .length को)

+2

मुझे इसे मारो: डी। भविष्य के संदर्भ के लिए @Dan, कॉफ़ीस्क्रिप्ट साइट पर "कोशिश करें" पृष्ठ इन वन-ऑफ पीढ़ी के उदाहरणों के लिए अच्छा हो सकता है – gerges

+1

वाह, मैंने कभी भी 'लूप' को कभी नहीं देखा है जो कि सरल ओओ – Cerbrus

+2

@Cerbus coffeescript पुनरावृत्ति के लिए बड़ा है उस वाक्यविन्यास के साथ द्विपक्षीय है, और संकलक इस बिंदु पर नहीं जान पाएंगे कि "0 से तर्क" ऊपर या नीचे गिन रहा है। "1 तक" के समावेशन के साथ आप संकलक को सकारात्मक गणना में जोड़ सकते हैं जिससे आप अधिक उपयोग कर सकते हैं। 'मैं [0..str.ength-0] में 1' – gerges

2

जावास्क्रिप्ट में (और इस तरह, यह भी CoffeeScript), strings पहुँचा जा सकता है।

आपको अपनी कॉफीस्क्रिप्ट फ़ाइलों में सादे जावास्क्रिप्ट का उपयोग करने में सक्षम होना चाहिए, हालांकि, अगर यह समस्या हल करती है।

+1

या पुराने ब्राउज़रों के लिए charAt() विधि है ... – nnnnnn

5

तुम भी स्वयं स्ट्रिंग से अधिक पुनरावृति हो सकता है:

for ch, i in str 
    # Do stuff here. 
+1

नाइस पढ़ने में आसान है। 'फॉर' लूप से केवल 'लंबाई 'संपत्ति रखने और' str [] 'को संभालने पर' str 'पर निर्भर करता है। –