克隆哈希数组的特定属性

时间:2016-01-18 13:54:57

标签: arrays ruby hash

我需要一些克隆哈希属性的帮助。 我有X个哈希值的数组BA = [ {"v1"=>{"description"=>"abc", "export_value"=>"2"}}, {"v2"=>{"description"=>"cba", "export_value"=>"2"}} ] B = [ {"v1"=>{"description"=>"", "export_value"=>"3"}}, {"v2"=>{"description"=>"", "export_value"=>"5"}} ] (目前为2):

B

Ruby中是否有任何方法(某些函数或任何东西)可以将某些属性从一个哈希克隆到另一个哈希。

例如,我想克隆" export_values"从数组AC = [ {"v1"=>{"description"=>"abc", "export_value"=>"3"}}, {"v2"=>{"description"=>"cba", "export_value"=>"5"}} ] 的属性,因此最终的哈希数组看起来像:

export http_proxy="http://user:pass@proxy.foo.bar"

1 个答案:

答案 0 :(得分:1)

你可以这样做:

A.map.with_index do |h, i| 
    h.merge(B[i]) do |_, hash_from_A, hash_from_B| 
        hash_from_A.merge(hash_from_B) do |k, o, n|
            k == "export_value" ? n : o
        end
    end
end

#=> [{"v1"=>{"description"=>"abc", "export_value"=>"3"}},
#    {"v2"=>{"description"=>"cba", "export_value"=>"5"}}]

如果您的应用可以访问Rails Active Support gem,那么您可以使用Hash#deep_merge简化上述代码。

require "active_support/core_ext/hash"

A.map.with_index do |h, i| 
    h.deep_merge(B[i]) do |k, o, n|
        k == "export_value" ? n : o
    end
end