2011-01-01 10 views
20

यहां मेरी स्थिति है। मैं 2 सरणीरुबी विलय दो Arrays एक

@names = ["Tom", "Harry", "John"] 

@emails = ["[email protected]", "[email protected]", "[email protected]"] 

है मैं कुछ सरणी/हैश में इन दो संयोजित करना चाहते हैं बुलाया @list तो मैं तो इस तरह मेरे विचार कुछ में पुनरावृति कर सकते हैं:

<% @list.each do |item| %> 
<%= item.name %><br> 
<%= item.email %><br> 
<% end %> 

मैं मुसीबत कैसे समझ आ रही है मैं इस लक्ष्य को प्राप्त कर सकता हूं। कोई विचार?

उत्तर

46
@names = ["Tom", "Harry", "John"] 
@emails = ["[email protected]", "[email protected]", "[email protected]"] 

@list = @names.zip(@emails) 
#=> [["Tom", "[email protected]"], ["Harry", "[email protected]"], ["John", "[email protected]"]] 

@list.each do |name,email| 
    # When a block is passed an array you can automatically "destructure" 
    # the array parts into named variables. Yay for Ruby! 
    p "#{name} <#{email}>" 
end 
#=> "Tom <[email protected]>" 
#=> "Harry <[email protected]>" 
#=> "John <[email protected]>" 

@urls = ["yahoo.com", "ebay.com", "google.com"] 

# Zipping multiple arrays together 
@names.zip(@emails, @urls).each do |name,email,url| 
    p "#{name} <#{email}> :: #{url}" 
end 
#=> "Tom <[email protected]> :: yahoo.com" 
#=> "Harry <[email protected]> :: ebay.com" 
#=> "John <[email protected]> :: google.com" 
+4

आहा का उपयोग करके इस सरणी को हैश में परिवर्तित कर सकते हैं! तो * यह * क्या है 'ज़िप' के लिए है! यह किसी भी तरह से वास्तव में मेरे मानक टूलबॉक्स में प्रवेश नहीं किया। अच्छा लगा। +1 – Matchu

+0

क्या यह समाधान अभी भी लागू होगा यदि मैंने @urls = ["yahoo.com", "ebay.com", "google.com" नामक एक और इंस्टेंस वैरिएबल जोड़ा है। – lou1221

+0

@ lou1221 हां; ऊपर अद्यतन अद्यतन देखें। 'ऐरे # ज़िप' तर्कों की मनमानी संख्या ले सकता है। – Phrogz

3

आप zipmap का उपयोग दो सरणियों एक साथ ज़िप करने कर सकते हैं और उसके बाद नाम-ईमेल-जोड़े से Item वस्तुओं को बनाने के। मान लें कि आप एक Item वर्ग जिसका initialize तरीकों एक हैश को स्वीकार करता है, कोड इस तरह दिखेगा:

@list = @names.zip(@emails).map do |name, email| 
    Item.new(:name => name, :email => email) 
end 
7
Hash[*names.zip(emails).flatten] 

यह आपको नाम => ईमेल के साथ एक हैश दे देंगे।

+1

के लिए धन्यवाद इस स्थिति के लिए काम करता है, लेकिन भविष्य के पाठकों से सावधान रहें: यह एक सामान्य समाधान नहीं है, क्योंकि यदि 'नाम' या 'ईमेल' सरणी होते हैं जिनमें सरणी होती है, तो 'flatten' पुनरावर्ती रूप से चलती है। – Matchu

+5

रूबी के तहत 1.9 आप बस कर सकते हैं: 'हैश [names.zip (ईमेल)] ' – Phrogz

+2

फ़्लैटन (1) वांछित होने पर रिकर्सन को रोक देगा। –

15

बस अलग होने की:

[@names, @emails, @urls].transpose.each do |name, email, url| 
    # . . . 
end 

यह Array#zip सिवाय इसके कि क्या करता है के समान है इस मामले में कम पंक्तियों के किसी भी नहीं के बराबर गद्दी नहीं होगी; अगर कुछ याद आ रही है तो अपवाद उठाया जाएगा।

+5

स्थानांतरण पर युक्ति बहुत अच्छी है। यह – lou1221

+1

पोस्ट करने के लिए धन्यवाद मैं पाइथन के 'ज़िप (* सरणी) 'की तलाश में था। यह बात है! – Droogans

3

प्रयास करें यह

Hash[@names.zip(@emails)] 

आप दो सरणियों @names = है [ "टॉम", "हैरी", "जॉन"]

@emails = [ "[email protected]", "[email protected]", "[email protected]com"]

@ names.zip (@emails) यह @emails को उनके सूचकांक से जुड़े @ नामों से नीचे [["टॉम", " [email protected] "], [" हैरी "," [email protected] "], [" जॉन "," [email protected] "]]

अब हम हैश [@ names.zip (@emails)]

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