2013-03-08 4 views
7

मैं एक ही समय में दो एरे बी और सी बनाना चाहता हूं। मैं दो विधियों को जानता हूं जो इसे प्राप्त करने में सक्षम हो सकते हैं। पहली विधिकॉफीस्क्रिप्ट के साथ एक ही लूप में दो सरणी कैसे बनाएं?

b = ([i, i * 2] for i in [0..10]) 
c = ([i, i * 3] for i in [0..10]) 

alert "b=#{b}" 
alert "c=#{c}" 

यह विधि केवल एक सरणी बनाने के लिए बहुत आसान है। मैं गणना के लिए बेहतर प्रदर्शन प्राप्त करने का बेहतर तरीका नहीं हो सकता।

दूसरी विधि है

b = [] 
c = [] 
for i in [0..10] 
    b.push [i, i*2] 
    c.push [i, i*3] 

alert "b=#{b}" 
alert "c=#{c}" 

इस विधि गणना दक्षता के लिए अच्छा लगता है, लेकिन दो पंक्तियों ख = [] ग = [] पहले लिखा जाना है। मैं यह 2 लाइनें नहीं लिखना चाहता हूं लेकिन मुझे जवाब देने का अच्छा विचार नहीं मिला है। बी और सी के सरणी के प्रारंभ के बिना, हम पुश विधि का उपयोग नहीं कर सकते हैं।

मौजूद अस्तित्व में मौजूद ऑपरेटर मौजूद है? कॉफ़ीस्क्रिप्ट में लेकिन मुझे इस समस्या में इसका उपयोग करने के लिए गर्म नहीं पता है। क्या आपके पास स्पष्ट प्रारंभिकरण के बिना बी और सी के सरणी बनाने के लिए एक बेहतर तरीका है?

धन्यवाद!

+0

शायद 'बी = सी = []' अधिक उपयुक्त होगा? – varnie

+0

धन्यवाद। आपको बी और सी के लिए एक ही परिणाम मिल जाएगा। जवाब गलत है। –

+1

@ वार्नी: नहीं, सरणी अलग होने की आवश्यकता है, और उनकी सामग्री अलग हैं। –

उत्तर

1

कैसे इस का उपयोग करते हुए अस्तित्व ऑपरेटर के बारे में:

for i in [0..10] 
    b = [] if not b?.push [i, i*2] 
    c = [] if not c?.push [i, i*3] 

console.log "b=#{b}" 
console.log "c=#{c}" 

या थोड़ा अधिक समझ में आने के लिए:

for i in [0..10] 
    (if b? then b else b = []).push [i, i*2] 
    (if c? then c else c = []).push [i, i*3] 

console.log "b=#{b}" 
console.log "c=#{c}" 

संपादित करें: टिप्पणी से:

ठीक है, लेकिन आप आपको इतने सारे थके हुए कोड लिखना है। इसी कारण `के लिए भी है (ख = ख या [])। धक्का [मैं, मैं * 2]

यह कठिन है, इसलिए हम एक समारोह में लपेट सकते हैं (लेकिन सावधान रहना चर हो जाएगा वैश्विक अब):

# for node.js 
array = (name) -> global[name] = global[name] or [] 

# for the browser 
array = (name) -> window[name] = window[name] or [] 

for i in [0..10] 
    array('b').push [i, i*2] 
    array('c').push [i, i*3] 

console.log "b=#{b}" 
console.log "c=#{c}" 
+0

ठीक है लेकिन आपको बहुत सारे थकाऊ कोड लिखना है। वही कारण '(बी = बी या []) के लिए भी है। पुश [i, i * 2]' –

+0

मैंने दूसरे विकल्प –

+1

बहुत जटिल के साथ उत्तर अपडेट किया। 'बी = []' और 'सी = []' के साथ अलग से शुरू करने से पहले भी कोई बेहतर तरीका नहीं है। मुझे आश्चर्य है कि क्या कुछ तरीके हैं जो मैंने उल्लेख किए गए पहले और दूसरे तरीकों को जोड़ सकते हैं।हमें शायद प्रारंभिक मान बनाने के लिए सरणी के लिए पुश विधि की परिभाषा को संशोधित करने की आवश्यकता हो सकती है। –

4

आप underscore की थोड़ी सी सहायता (या किसी अन्य lib कि zip की तरह सुविधा प्रदान करता है) का उपयोग कर सकते हैं:

[b, c] = _.zip ([[i, i * 2], [i, i * 3]] for i in [0..10])... 

यह क्रियान्वित करने के बाद हमने:

coffee> b 
[ [ 0, 0 ], 
    [ 1, 2 ], 
    [ 2, 4 ], 
    [ 3, 6 ], 
    [ 4, 8 ], 
    [ 5, 10 ], 
    [ 6, 12 ], 
    [ 7, 14 ], 
    [ 8, 16 ], 
    [ 9, 18 ], 
    [ 10, 20 ] ] 

coffee> c 
[ [ 0, 0 ], 
    [ 1, 3 ], 
    [ 2, 6 ], 
    [ 3, 9 ], 
    [ 4, 12 ], 
    [ 5, 15 ], 
    [ 6, 18 ], 
    [ 7, 21 ], 
    [ 8, 24 ], 
    [ 9, 27 ], 
    [ 10, 30 ] ] 

अधिक जानकारी और उदाहरणों के लिए कॉफीस्क्रिप्ट दस्तावेज़ों में section about splats देखें।

+0

बहुत रोचक लेकिन यह वास्तव में एक चुनौती है। मुझे इसके साथ सही जवाब नहीं मिला है। धन्यवाद। –

+0

मैंने अपने उत्तर को परिणाम के साथ अपडेट किया है। क्या यह गलत है? –

+0

बहुत बहुत धन्यवाद। मुझे भी वही परिणाम मिल गए हैं। मैं लाइन के अंत में तीन बिंदु भूल गया। मैंने तीन बिंदुओं के उपयोग को वास्तव में अच्छी तरह समझ नहीं लिया है। आपका बहुत बहुत धन्यवाद। –

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