2009-12-30 13 views
111

क्या कोई आसान या सुरुचिपूर्ण डुप्लिकेट कुंजी ओवरराइट किए बिना दो हैंश मर्ज करने का तरीका है?रुबी में डुप्लिकेट कुंजियों को ओवरराइट किए बिना मैं दो हैंश कैसे विलय कर सकता हूं?

यही है, यदि मूल हैश में कुंजी मौजूद है तो मैं इसका मान बदलना नहीं चाहता हूं। विलय optionsdefaults में:

options = defaults.merge(options) 

या

+0

तुम सच मतलब है सरणियों (जैसे: [ 'एक', 'बी', 'सी']) या हैश (जैसे: { 'एक' => 1, 'बी' => 2, 'ग '=> 3})? –

+0

क्षमा करें, मैं हैश के बारे में बात कर रहा था :) –

उत्तर

178

आप दो हैश, options और defaults है, और आप मौजूदा चाबियाँ अधिलेखित बिना options में defaults मर्ज करना चाहते हैं, तो आप वास्तव में क्या करना चाहते हैं विपरीत है , आप रेल उपयोग कर रहे हैं आप कर सकते हैं:

options.reverse_merge!(defaults) 
+0

पूरी तरह से सहमत हैं, reverse_merge के लिए बहुत बहुत धन्यवाद! विधि को यह नहीं पता था :) –

+0

यहां आवश्यक ब्रांड्स की आवश्यकता क्यों है? आप बस डिफ़ॉल्ट रूप से नहीं कर सकते हैं। यह विकल्प दिखाई देता है। – Donato

4

तो अपनी समस्याओं मूल हैश और दूसरा एक दोनों डुप्लिकेट चाबी हो सकता है और आप नहीं करना चाहते हैं वह यह है कि किसी भी दिशा में ऊपर लिख, आप टक्कर की जांच किसी तरह का और हैंडलिंग के साथ एक सरल मैनुअल मर्ज के लिए जाने के लिए हो सकता है:

hash2.each_key do |key| 
    if (hash1.has_key?(key)) 
     hash1[ "hash2-originated-#{key}" ] = hash2[key] 
    else 
     hash1[key]=hash2[key] 
    end 
end 

जाहिर है, यह बहुत ही अल्पविकसित है और मानता है कि hash1 किसी भी कुंजी "hash2 बुलाया नहीं है -ऑर्गिनेटेड-जो भी हो "- आप कुंजी को केवल एक संख्या जोड़कर बेहतर हो सकते हैं, इसलिए यह कुंजी 1, की 2 और तब तक बन जाता है जब तक आप उस पर हिट नहीं करते जो पहले से हैश 1 में नहीं है। इसके अलावा, मैंने कुछ महीनों के लिए कोई रूबी नहीं की है, इसलिए शायद यह वाक्य रचनात्मक रूप से सही नहीं है, लेकिन आपको जिस्ट प्राप्त करने में सक्षम होना चाहिए।

वैकल्पिक रूप से कुंजी के मान को सरणी के रूप में फिर से परिभाषित करें ताकि हैश 1 [कुंजी] हैश 1 से मूल मान और हैश 2 से मान लौटाता है। निर्भर करता है कि आप वास्तव में अपने परिणाम क्या चाहते हैं।

+0

अगर दोनों कुंजी नहीं रखते हैं, लेकिन एक ही कुंजी के मान जोड़ रहे हैं? –

+1

@ TomK.C.Chiu यह उन परिस्थितियों पर बहुत अधिक निर्भर करेगा कि हम इस सवाल से न्याय नहीं कर सकते हैं - क्या होगा यदि हैश 1 में मान स्ट्रिंग हैं और हैश 2 पूर्णांक हैं? कुछ मामलों के लिए जो एक व्यवहार्य विकल्प हो सकता है, लेकिन अक्सर यह समस्याएं पैदा करेगा- मूल्यों के लिए सूचियों का उपयोग करने का सुझाव इस बारे में काफी साफ करता है। – glenatron

13

मानक रूबी लाइब्रेरी में मौजूदा मूल्यों को ओवरराइट किए बिना हैश को फिर से लिखने के बिना हैश को मर्ज करने का एक तरीका है।

important_hash.merge!(defaults) { |key, important, default| important } 
संबंधित मुद्दे