Techioz Blog

ハッシュの配列を単一のハッシュにマッピングする Rails

概要

次のようなハッシュの配列があります。

 [{"testPARAM1"=>"testVAL1"}, {"testPARAM2"=>"testVAL2"}]

そして、これを次のように単一のハッシュにマッピングしようとしています:

{"testPARAM2"=>"testVAL2", "testPARAM1"=>"testVAL1"}

を使用してそれを達成しました

  par={}
  mitem["params"].each { |h| h.each {|k,v| par[k]=v} } 

しかし、私はこれをより慣用的な方法で (できればローカル変数を使用せずに) 実行できないかどうか疑問に思っていました。

これどうやってするの?

解決策

Enumerable#reduce と Hash#merge を作成して、必要なことを実現できます。

input = [{"testPARAM1"=>"testVAL1"}, {"testPARAM2"=>"testVAL2"}]
input.reduce({}, :merge)
  is {"testPARAM2"=>"testVAL2", "testPARAM1"=>"testVAL1"}

配列の縮小は、配列の各要素の間にメソッド呼び出しを挿入するようなものです。

たとえば、[1, 2, 3].reduce(0, :+) は、0 + 1 + 2 + 3 と言うのと同じで、6 が得られます。

この例では、同様のことを行いますが、マージ関数を使用して 2 つのハッシュをマージします。

[{:a => 1}, {:b => 2}, {:c => 3}].reduce({}, :merge)
  is {}.merge({:a => 1}.merge({:b => 2}.merge({:c => 3})))
  is {:a => 1, :b => 2, :c => 3}