2009-04-24 23 views
3

Gibt es eine einfache Möglichkeit, die folgende Art und Weise einen Hash in Ruby von Remapping: in einer Art und WeiseWas ist der beste Weg, um einen Hash in Ruby neu zu ordnen?

{"foo" => "bar"} 

Vorzugsweise, die es einfach macht, dies zu tun:

aus:

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

zu Operation beim Iterieren über ein Array dieser Art von Hashes:

von:

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

zu:

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

Dank.

Antwort

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

Ja, das ist fast, was ich auch tat, aber ich verwendet x.values ​​[0] und x.values ​​[1] anstelle von x [: Name] und x [: Wert], falls ich die Schlüssel nicht im Voraus kenne. Ich war Angeln für eine noch einfachere Möglichkeit, dies zu tun, aber es gibt möglicherweise keine ... –

+3

Hash-Werte sind außer Betrieb, so dass Sie x.values ​​[0] und x.values ​​[1] –

+0

nicht tun können +1 zu Vanson .. Sie können sehen, dass der Inhalt des Ergebnisses bereits außer Betrieb ist, da es ein Hash ist. – Gishu

3

Eine modifizierte Version von Vanson Samuel Code tut das beabsichtigte. Es ist ein One-Liner, aber ein ziemlich langer.

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

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

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

Ich würde nicht sagen, dass es hübscher ist als Gishus Version, obwohl.

1

Als allgemeine Faustregel gilt: Wenn Sie einen Hash der Form {: name => "foo",: value => "bar"} haben, ist es normalerweise besser, ein Tupel von [" foo "," bar "].

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

Ich weiß, das ist alt, aber der sauberste Weg, dies zu erreichen, ist das Array von Hashes zu einer Reihe von Tupeln auf der Karte, dann verwenden Hash [] einen Hash aus, dass zu bauen, wie folgt:

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

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

ein bisschen spät, aber:

[{ name: "foo", value: "bar" },{name: "foo2", value: "bar2"}].map{ |k| k.values }.to_h