उदाहरण के लिए, मैं एक हैशसरणी हैश करने के लिए
a = [{a: :b}, {c: :d}]
सबसे अच्छा तरीका यह इस में परिवर्तित करने के क्या है की सरणी है?
{a: :b, c: :d}
उदाहरण के लिए, मैं एक हैशसरणी हैश करने के लिए
a = [{a: :b}, {c: :d}]
सबसे अच्छा तरीका यह इस में परिवर्तित करने के क्या है की सरणी है?
{a: :b, c: :d}
आप
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}
उन दो लाइनों के बराबर हैं:
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
आप उपयोग कर सकते हैं .inject
:
a.inject(:merge)
#=> {:a=>:b, :c=>:d}
जो दो विलय से प्रत्येक पुनरावृत्ति पर एक नया हैश शुरू करता है। इससे बचने के लिए, आप विनाशकारी :merge!
(या :update
है, जो एक ही है) का उपयोग कर सकते हैं:
a.inject(:merge!)
#=> {:a=>:b, :c=>:d}
प्रयास करें इस
a.inject({}){|acc, hash| acc.merge(hash)} #=> {:a=>:b, :c=>:d}
'Hash.new', या की तरह करने के लिए दोस्तों के रूप में उसे कॉल करें, '{} ':-) जितना मुझे शुद्ध कार्यात्मक समाधान पसंद है, ध्यान दें कि' विलय 'प्रत्येक पुनरावृत्ति पर एक नया हैश बना देगा; हम इसके बजाय 'अपडेट'' का उपयोग कर सकते हैं (यह इनपुट हैश के साथ गड़बड़ नहीं करेगा, यह महत्वपूर्ण बिंदु है): 'hs.reduce ({},: अद्यतन) ' – tokland
खूबसूरती से – Aeramor
@ टोकलैंड किया गया, अपनी टिप्पणी को अलग के रूप में पोस्ट करें उत्तर - इसे और अधिक दृश्यता मिलनी चाहिए – Jason