2013-05-09 2 views
-1

Я борюсь с этой проблемой, и я не могу понять, как это сделать. Давайте предположим, что у меня есть два хэшей:Ruby deep merge with different hash types

hash1 = { "address" => "address", "phone" => "phone } 
hash2 = { "info" => { "address" => "x", "phone" => "y"}, 
      "contact_info" => { "info" => { "address" => "x", "phone" => "y"} }} 

Я хотел бы получить этот вывод:

{ "info" => { "address" => "address", "phone" => "phone"}, 
    "contact_info" => { "info" => { "address" => "address", "phone" => "phone"} }} 

Я пытался Hash#deep_merge, но это не решает мою проблему. Мне нужно что-то, что объединит все ключи и значения в любом месте во втором хеше, какова бы ни была его структура.

Как я могу это сделать? Любые подсказки?

+0

Ваше выражение недействительно. Ваши предложения недействительны. Кроме того, в нем нет никаких вопросов. – sawa

ответ

2

Я думаю, что вы хотите рекурсивно объединить hash1? Возможно, это:

class Hash 

    def deep_merge_each_key(o) 
    self.keys.each do |k| 
     if o.has_key?(k) 
     self[k] = o[k] 
     elsif self[k].is_a?(Hash) 
     self[k].deep_merge_each_key(o) 
     end 
    end 
    self 
    end 
end 

h1 = {"address"=>"address", "phone"=>"phone"} 
h2 = { 
    "info" => { "address" => "x", "phone" => "y"}, 
    "contact_info" => { "info" => { "address" => "x", "phone" => "y"} } 
} 

puts h2.deep_merge_each_key(h1).inspect 

# => {"info"=>{"address"=>"address", "phone"=>"phone"}, "contact_info"=>{"info"=>{"address"=>"address", "phone"=>"phone"}}}