Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 1.8.7中两种不同嵌套哈希之间的差异_Ruby_Hash_Hashmap_Nested Attributes_Ruby On Rails 2 - Fatal编程技术网

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
'
或all
nil
)?如果这是疏忽,不需要回复;我会在您编辑后删除此评论…如果是这样,我不明白为什么
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"]}}