Ruby 1.8.7中两种不同嵌套哈希之间的差异
考虑以下嵌套哈希:Ruby 1.8.7中两种不同嵌套哈希之间的差异,ruby,hash,hashmap,nested-attributes,ruby-on-rails-2,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"
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"}}
输出应如下所示(两个哈希值之间的差异):
感谢您的建议。请提前感谢。以下是一些难看的代码:
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"]}}
可以使用以块为单位的形式以紧凑的方式生成所需的结果:
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"]}}
我不知道主题初学者的要求,所以作为一个警告:当data1的键少于data2时,这将无法处理这种情况。对于更深层的嵌套哈希也不起作用。这也是有帮助的。您的意思是,键
中间的在data1
和data2
中具有相同的值(即,all'
或allnil
)?如果这是疏忽,不需要回复;我会在您编辑后删除此评论…如果是这样,我不明白为什么middle=>[nil',]
不会出现在您想要的输出中。请通过编辑(而不是在注释中)进行澄清。如果值相同,则不会返回该值,只有不同的值将与键一起返回,如果该键在data1和Data2之间不匹配,则如果任何字段为空,例如:“middle”在data1和data2中,它将不会在输出中返回。因此,出于包含/排除标准的目的,“nil”和“
被视为相同的值?
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"]}}