合并具有相同键的值的哈希

时间:2020-07-27 15:04:00

标签: ruby hash merge hash-of-hashes

我想知道什么是达到此目的的最佳方法:

my_hash_1 = { fruits: { red: 'apple' }, vegetables: { green: 'spinach' } }

my_hash_2 = { fruits: { green: 'grapes' } }

expected_output = { fruits: { red: 'apple', green: 'grapes' }, vegetables: { green: 'spinach' } }

我已经研究过使用合并!但这给了我输出:

{:fruits=>{:green=>"grapes"}, :vegetables=>{:green=>"spinach"}}

3 个答案:

答案 0 :(得分:2)

merge不是递归的,因此它仅使用默认行为将两个哈希中的fruitsvegetables项合并。您需要为merge!提供一个块,以进入下一级哈希并将它们与默认merge合并。

my_hash_1 = { fruits: { red: 'apple' }, vegetables: { green: 'spinach' } }
my_hash_2 = { fruits: { green: 'grapes' } }

expected_output = my_hash_1.merge(my_hash_2) { |_, h1, h2| h1.merge(h2) }

p expected_output

结果

{:fruits=>{:red=>"apple", :green=>"grapes"}, :vegetables=>{:green=>"spinach"}}

答案 1 :(得分:1)

my_hash_1 = { fruits: { red: 'apple' }, vegetables: { green: 'spinach' } }
my_hash_2 = { fruits: { green: 'grapes' } }
my_hash_3 = { fruits: { yellow: 'mango' },spice: { red: 'chilli' }}

# extended method (multiple hash)
def merge_hash(arr_of_hash)
    result = {}
    arr_of_hash.each do |_hash|
        _hash.each{ |k,v| result[k].nil? ? result[k] = v : result[k].merge!(v) }
    end
    result
end
puts merge_hash([my_hash_1,my_hash_2,my_hash_3])
# {:fruits=>{:red=>"apple", :green=>"grapes", :yellow=>"mango"}, :vegetables=>{:green=>"spinach"}, :spice=>{:red=>"chilli"}}

答案 2 :(得分:0)

这两个答案确实可以解决我想做的事情,但是由于我只使用两个哈希并且知道要合并的键,所以我最终做了这样的事情,发现比较简单。

my_hash_1 = { fruits: { red: 'apple' }, vegetables: { green: 'spinach' } }

my_hash_2 = { fruits: { green: 'grapes' } }

my_hash_1[:fruits]&.merge!(my_hash_2[:fruits]) unless my_hash_2[:fruits].nil?

这实际上将把my_hash_1中的两者合并。