2014-06-13 22 views
0

考慮以下嵌套哈希:差分之間2不同的嵌套散列紅寶石1.8.7

data1 = { 
    "3"=>{"passenger_type"=>"ADT", "the_order"=>"3", "last"=>"JONES", "first"=>"ALENA", "middle"=>nil}, 
    "2"=>{"passenger_type"=>"ADT", "the_order"=>"2", "last"=>"JONES", "first"=>"MAXIM", "middle"=>nil}, 
    "1"=>{"passenger_type"=>"ADTT", "the_order"=>"1", "last"=>"JONES", "first"=>"TODD", "middle"=>nil}} 


data2 = { 
    "3"=>{"first"=>"ALENA", "the_order"=>"3", "middle"=>"", "passenger_type"=>"ADTT", "last"=>"JONES"}, 
    "2"=>{"first"=>"MAXIM", "the_order"=>"2", "middle"=>"", "passenger_type"=>"ADT", "last"=>"JONES"}, 
    "1"=>{"first"=>"TODD", "the_order"=>"1", "middle"=>"", "passenger_type"=>"ADT", "last"=>"JONESS"}} 

輸出應該是這樣的(兩個散列列出的值之間的差):

{"3" => {"passenger_type" => ["ADT", "ADTT"]}, 
"1" => {"passenger_type" => ["ADTT", "ADT"], "last" => ["JONES", "JONESS"]} 

任何您的建議表示感謝,提前致謝。

+0

你是否認爲'data1'和'data2'(即所有''''或全部'nil')鍵的'middle'具有相同的值?如果這是一個疏忽,就不需要回復;編輯完成後,我會刪除這條評論... –

+0

是的正確! –

+0

在這種情況下,我不明白爲什麼'middle => [nil,'']'沒有出現在你想要的輸出中。請通過編輯來澄清(而不是在評論中)。 –

回答

1

可以使用的Hash#merge,需要一個塊的形式,以產生以緊湊的方式所期望的結果:

data1.merge(data2) { |_,ho,hn| 
     ho.merge(hn) { |_,o,n| (o==n||o==''||n=='') ? nil : [o,n] } 
     .delete_if { |_,v| v==nil } } 
    .delete_if { |_,v| v.empty? } 
    #=> {"3"=>{"passenger_type"=>["ADT", "ADTT"]}, 
    # "1"=>{"passenger_type"=>["ADTT", "ADT"], "last"=>["JONES", "JONESS"]}} 
+0

緊湊美人! :) – zx81

0

下面是一些醜陋的代碼:

data3 = {} 
data1.each do |k, v| 
    v2 = data2[k] 
    v.each do |item, val| 
    if v2.has_key?(item) then 
     if (val == nil or val == '') and (v2[item] == nil or v2[item] == '') then 
     next 
     end 

     if val != v2[item] then 
     data3[k] ||= {} 
     data3[k][item] = [val, v2[item]] 
     end 
    end 
    end 
end 

puts data3 

打印

{"3"=>{"passenger_type"=>["ADT", "ADTT"]}, "1"=>{"passenger_type"=>["ADTT", "ADT"], "last"=>["JONES", "JONESS"]}} 
+0

不知道主題起始者的要求,所以只是作爲一個警告:當data1的鍵數少於data2時,這不會處理這種情況。也不適用於嵌套更深的哈希。 – twonegatives

+0

這也是有用的加工商, –