2012-06-08 15 views

उत्तर

94

आप

a.reduce Hash.new, :merge 

जो सीधे पैदावार

{:a=>:b, :c=>:d} 

ध्यान दें कि टकराव के मामले में क्रम महत्वपूर्ण है का उपयोग कर सकते हैं। लैटर हैश पिछले मैपिंग ओवरराइड, जैसे देखें:

[{a: :b}, {c: :d}, {e: :f, a: :g}].reduce Hash.new, :merge # {:a=>:g, :c=>:d, :e=>:f} 
+25

'Hash.new', या की तरह करने के लिए दोस्तों के रूप में उसे कॉल करें, '{} ':-) जितना मुझे शुद्ध कार्यात्मक समाधान पसंद है, ध्यान दें कि' विलय 'प्रत्येक पुनरावृत्ति पर एक नया हैश बना देगा; हम इसके बजाय 'अपडेट'' का उपयोग कर सकते हैं (यह इनपुट हैश के साथ गड़बड़ नहीं करेगा, यह महत्वपूर्ण बिंदु है): 'hs.reduce ({},: अद्यतन) ' – tokland

+0

खूबसूरती से – Aeramor

+0

@ टोकलैंड किया गया, अपनी टिप्पणी को अलग के रूप में पोस्ट करें उत्तर - इसे और अधिक दृश्यता मिलनी चाहिए – Jason

19

उन दो लाइनों के बराबर हैं:

total_hash = hs.reduce({}) { |acc_hash, hash| acc_hash.merge(hash) } 
total_hash = hs.reduce({}, :merge) 

ध्यान दें कि Hash#merge प्रत्येक यात्रा पर एक नया हैश है, जो एक समस्या हो सकती है यदि आप एक निर्माण कर रहे हैं बनाता है बड़ा हैश उस मामले में, update बजाय का उपयोग करें:

total_hash = hs.reduce({}, :update) 

एक वैकल्पिक दृष्टिकोण होगा जोड़े के लिए हैश कन्वर्ट करने के लिए और फिर अंतिम हैश का निर्माण:

total_hash = hs.flat_map(&:to_a).to_h 
18

आप उपयोग कर सकते हैं .inject:

a.inject(:merge) 
#=> {:a=>:b, :c=>:d} 

Demonstration

जो दो विलय से प्रत्येक पुनरावृत्ति पर एक नया हैश शुरू करता है। इससे बचने के लिए, आप विनाशकारी :merge! (या :update है, जो एक ही है) का उपयोग कर सकते हैं:

a.inject(:merge!) 
#=> {:a=>:b, :c=>:d} 

Demonstration

0

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

a.inject({}){|acc, hash| acc.merge(hash)} #=> {:a=>:b, :c=>:d} 
संबंधित मुद्दे