私は次のようなハッシュの配列を持っています:
[{"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}
_
どうですか:
h = [{"testPARAM1"=>"testVAL1"}, {"testPARAM2"=>"testVAL2"}]
r = h.inject(:merge)
#inject を使用します
hashes = [{"testPARAM1"=>"testVAL1"}, {"testPARAM2"=>"testVAL2"}]
merged = hashes.inject({}) { |aggregate, hash| aggregate.merge hash }
merged # => {"testPARAM1"=>"testVAL1", "testPARAM2"=>"testVAL2"}
ここでは、 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"}