4

次の方法でルビーでハッシュを再マッピングする簡単な方法はありますか:

から:

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

に:

{"foo" => "bar"}

できれば、このタイプのハッシュの配列を反復処理しながら、この操作を簡単に実行できる方法で:

から:

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

に:

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

ありがとう。

4

5 に答える 5

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"}
于 2009-04-24T08:31:07.620 に答える
3

VansonSamuelのコードの修正バージョンは意図したとおりです。ワンライナーですが、かなり長いものです。

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

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

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

とはいえ、ギスのバージョンよりもきれいだとは言えません。

于 2009-04-24T14:22:15.527 に答える
1

これが古いことは知っていますが、これを実現する最も適切な方法は、次のように、ハッシュの配列をタプルの配列にマップし、Hash[] を使用してそこからハッシュを構築することです。

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

# => {"foo"=>"bar", "foo2"=>"bar2"}
于 2012-04-16T05:30:15.430 に答える
1

一般的な経験則として、{:name => "foo", :value => "bar"} の形式のハッシュがある場合、通常は ["foo", " のタプルを使用する方が適切です。バー"]。

arr = [["foo", "bar"], ["foo2", "bar2"]]
arr.inject({}) { |accu, (key, value)| accu[key] = value; accu }
于 2009-04-24T17:44:57.477 に答える
0

少し遅れましたが:

[{ name: "foo", value: "bar" },{name: "foo2", value: "bar2"}].map{ |k| k.values }.to_h
于 2016-04-06T10:32:41.623 に答える