2009-04-24 7 views
3

ルビーで次のようにハッシュを再マッピングする簡単な方法があります:Rubyでハッシュを再マップする最良の方法は何ですか?

から:

{:name => "foo", :value => "bar"} 

へ:

{"foo" => "bar"} 

好ましくは、それは簡単なこれを行うために作る方法では、操作ハッシュこのタイプの配列を反復しつつ:から

[{:name => "foo", :value => "bar"}, {:name => "foo2", :value => "bar2"}] 

へ:

{"foo" => "bar", "foo2" => "bar2"} 

感謝。

答えて

9
arr = [ {:name=>"foo", :value=>"bar"}, {:name=>"foo2", :value=>"bar2"}] 

result = {} 
arr.each{|x| result[x[:name]] = x[:value]} 

# result is now {"foo2"=>"bar2", "foo"=>"bar"} 
+0

はい、これは私もやったことはほとんどですが、私が使用しx.values [0]とx.values [1]の代わりのxの[:名]とx [:value]キーがわからない場合は、 私はこれを行うためのさらに簡単な方法のために釣りをしていましたが、1つではないかもしれません... –

+3

ハッシュ値は、x.values [0]とx.values [1]を行うことができないので無効です。 –

+0

Vansonに+1すると、結果の内容がハッシュ以降既に不調であることがわかります。 – Gishu

3

Vanson Samuelのコードの修正版が意図されています。 これは1ライナーですが、かなり長いものです。

arr = [{:name=>"foo", :value=>"bar"}, {:name=>"foo2", :value=>"bar2"}] 

arr.inject({}){|r,item| r.merge({item['name'] => item['value']})} 

# result {"foo" => "bar", "foo2" => "bar2"} 

私は紀州のバージョンよりもきれいだとは言いませんが、

1

{:name => "foo"、:value => "bar"}の形式のハッシュをお持ちの場合は、通常、[" foo "、" bar "]。

arr = [["foo", "bar"], ["foo2", "bar2"]] 
arr.inject({}) { |accu, (key, value)| accu[key] = value; accu } 
1

私はこれが古いですけど、これを達成するためにneatest方法は、以下のように、それからハッシュを構築するために[]ハッシュを使用し、その後、タプルの配列にハッシュの配列をマッピングすることです。

arr = [{:name => "foo", :value => "bar"}, {:name => "foo2", :value => "bar2"}] 
Hash[ array.map { |item| [ item[:name], item[:value] ] } ] 

# => {"foo"=>"bar", "foo2"=>"bar2"} 
0

少し遅れたが:

[{ name: "foo", value: "bar" },{name: "foo2", value: "bar2"}].map{ |k| k.values }.to_h 
関連する問題