web-dev-qa-db-ja.com

マージ方法Rubyハッシュ

これら2つのハッシュをマージするにはどうすればよいですか:

{:car => {:color => "red"}}
{:car => {:speed => "100mph"}}

取得するため:

{:car => {:color => "red", :speed => "100mph"}}
45
skyporter

Hash#merge メソッド:

Ruby-1.9.2 > a = {:car => {:color => "red"}}
 => {:car=>{:color=>"red"}} 
Ruby-1.9.2 > b = {:car => {:speed => "100mph"}}
 => {:car=>{:speed=>"100mph"}} 
Ruby-1.9.2 > a.merge(b) {|key, a_val, b_val| a_val.merge b_val }
 => {:car=>{:color=>"red", :speed=>"100mph"}} 

ネストされたハッシュをマージする必要がある場合、再帰的なメソッドを作成できます。

def merge_recursively(a, b)
  a.merge(b) {|key, a_item, b_item| merge_recursively(a_item, b_item) }
end

Ruby-1.9.2 > merge_recursively(a,b)
 => {:car=>{:color=>"red", :speed=>"100mph"}} 
61

Hash#deep_merge

Rails 3.0 +

a = {:car => {:color => "red"}}
b = {:car => {:speed => "100mph"}}
a.deep_merge(b)
=> {:car=>{:color=>"red", :speed=>"100mph"}} 

出典: https://speakerdeck.com/u/jeg2/p/10-things-you-didnt-know-Rails-could-do スライド24

また、

http://apidock.com/Rails/v3.2.13/Hash/deep_merge

36
Andrei

Rubyライブラリで定義されているmergeメソッドを使用できます。 https://Ruby-doc.org/core-2.2.0/Hash.html# method-i-merge


h1={"a"=>1,"b"=>2} 
h2={"b"=>3,"c"=>3} 
h1.merge!(h2)

このように出力されます{"a"=>1,"b"=>3,"c"=>3}

Mergeメソッドは重複キーを許可しないため、キーbは2から3に上書きされます。

上記の問題を克服するには、このようなmergeメソッドをハックできます。

h1.merge(h2){|k,v1,v2|[v1,v2]}

上記のコードスニペットは出力を提供します

{"a"=>1,"b"=>[2,3],"c"=>3}
10
h1 = {:car => {:color => "red"}}
h2 = {:car => {:speed => "100mph"}}
h3 = h1[:car].merge(h2[:car])
h4 = {:car => h3}
2
bor1s