我想知道什么是达到此目的的最佳方法:
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"}}
答案 0 :(得分:2)
merge
不是递归的,因此它仅使用默认行为将两个哈希中的fruits
和vegetables
项合并。您需要为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
中的两者合并。