Ruby:合并包含数组的哈希

Ruby: Merge Hash containing Arrays

我正在尝试合并两个 Hashes.I 从 here 获得代码。如您所见,我想在我的列表中再添加一项爱好。 有很多爱好。 h1成立时,只有一个爱好。当第二个爱好到来时,我想将它与之前的哈希合并。

哈希的结构是:

h1 = {"students"=>[{"name"=>"bobby", "hobbies"=>[{"outdoor"=>"cycling"}]}]}

h2 = {"students"=>[{"name"=>"bobby", "hobbies"=>[{"indoor"=>"reading"}]}]}

我运行这个代码:

res = h1.merge(h2) {|key,val1,val2| val1.merge val2}

我得到的错误是:

 undefined method `merge' for [{"name"=>"bobby", "hobbies"=>[{"outdoor"=>"cycling"}]}]:Array (NoMethodError)

所以既然涉及到数组,就不知道怎么办了。任何帮助。

所需输出:

{"students"=>[{"name"=>"bobby", "hobbies"=>[{"outdoor"=>"cycling", "indoor"=>"reading"}]}]}

你的问题的答案可能是:

h1.merge(h2) { |k, v1, v2| 
  v1.map.with_index { |v1e, idx| 
    v1e['hobbies'].first.merge! v2[idx]['hobbies'].first
    v1e  
  }
  v1 
}

#⇒ {
#  "students" => [
#    [0] {
#      "hobbies" => [
#        [0] {
#           "indoor" => "reading",
#          "outdoor" => "cycling"
#        }
#      ],
#         "name" => "bobby"
#    }
#  ]
# }

但我肯定会将 hobbies 重新设计为哈希,而不是哈希数组,从而消除奇怪的 first 调用:

v1e['hobbies'].merge! v2[idx]['hobbies']

希望对您有所帮助。

内置的边距方法不能做你想做的事。 您应该编写原始代码来合并这些结构。

def recursive_merge(h1, h2)
   case h1
   when Hash
      (h1.keys + h2.keys).each do |key|
         if h1.include?(key) && h2.include?(key) then
            recursive_merge(h1[key], h2[key])
         elsif h2.include?(key)
            h1[key] = h2[key]
         end
      end
   when Array
      for i in 0...([h1.count, h2.count].max)
         if i < h1.count && i < h2.count then
            recursive_merge(h1[i], h2[i])
         elsif i < h2.count then
            h1[i] = h2[i]
         end
      end
   end
end

recursive_merge(h1, h2)
puts h1

此方法产生以下输出。 请注意,此方法会覆盖 h1 本身。

{"students"=>[{"name"=>"bobby", "hobbies"=>[{"outdoor"=>"cycling", "indoor"=>"reading"}]}]}