Ruby 1.8.7中2个不同嵌套哈希的区别

时间:2014-06-13 06:42:04

标签: ruby hash hashmap nested-attributes ruby-on-rails-2

考虑以下嵌套哈希:

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"]}

任何人都应该感谢您的建议,谢谢。

2 个答案:

答案 0 :(得分: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"]}}

答案 1 :(得分: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"]}}