web-dev-qa-db-ja.com

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

私は次のようなハッシュの配列を持っています:

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

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

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

私はそれを達成しました

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

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

これどうやってするの?

80
Bart Platak

_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}
_
137
cjhveal

どうですか:

h = [{"testPARAM1"=>"testVAL1"}, {"testPARAM2"=>"testVAL2"}]
r = h.inject(:merge)
48
shigeya

#inject を使用します

hashes = [{"testPARAM1"=>"testVAL1"}, {"testPARAM2"=>"testVAL2"}]
merged = hashes.inject({}) { |aggregate, hash| aggregate.merge hash }
merged # => {"testPARAM1"=>"testVAL1", "testPARAM2"=>"testVAL2"}
9
Joshua Cheek

ここでは、 inject または reduce from Enumerable クラスのいずれかを使用できます。両方とも互いのエイリアスであるため、どちらにもパフォーマンス上の利点はありません。

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

 result1 = sample.reduce(:merge)
 # {"testPARAM1"=>"testVAL1", "testPARAM2"=>"testVAL2"}

 result2 = sample.inject(:merge)
 # {"testPARAM1"=>"testVAL1", "testPARAM2"=>"testVAL2"}
0