Ruby Hash zum Array von Werten

118

Ich habe das:

hash  = { "a"=>["a", "b", "c"], "b"=>["b", "c"] } 

und ich möchte dazu kommen: [["a","b","c"],["b","c"]]

Dies scheint zu funktionieren, aber es funktioniert nicht:

hash.each{|key,value| value}
=> {"a"=>["a", "b", "c"], "b"=>["b", "c"]} 

Irgendwelche Vorschläge?

tbrooke
quelle
Die folgenden Antworten sind korrekt ( hash.valuesdie bessere IMO). Aber ich wollte darauf hinweisen, wenn Sie einen Block dafür bereitstellen, Hash#eachwird nur der volle Wert des Hash zurückgegeben. Wenn Sie für jedes Element eine Operation ausführen und diese als Array zurückgeben möchten, verwenden Sie Hash#collectoder deren Alias Hash#map. Mehr zu Enumerables hier .
Brymck
3
Diese Frage kommt mir seltsam bekannt vor ... Ich frage mich, wie viele Leute gerade an derselben Hausaufgabe arbeiten.
Peter Brown

Antworten:

260

Auch ein bisschen einfacher ....

>> hash = { "a"=>["a", "b", "c"], "b"=>["b", "c"] }
=> {"a"=>["a", "b", "c"], "b"=>["b", "c"]}
>> hash.values
=> [["a", "b", "c"], ["b", "c"]]

Ruby doc hier

Ray Toal
quelle
3
+! Raffiniert! Ich werde trotz einer konkurrierenden Antwort (mit map) upvoten , weil mir das sehr gefällt!
Michael Durrant
2
Hash#valuesist nicht nur einfacher, sondern auch effizienter. Vergleiche time ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.values'mittime ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.map{|k,v| v}'
jordanbtucker
+1 (Erstaunt, nachdem ich Ihren Code ausprobiert habe) Ich habe einen Tag ohne Glück damit verbracht, den Index mit vielen Methoden zu entfernen ... Alles was ich sagen kann, vielen Dank !!! : D
Römer 8.38-39
2
Werden die Schlüssel in der genauen Reihenfolge gedruckt, in der sie vorkommen?
Stack1
42

Ich würde ... benutzen:

hash.map { |key, value| value }
Michael Durrant
quelle
3
Ich habe es nicht abgelehnt, aber es ist ein komplizierteres Äquivalent zu Hash#values.
Mark Thomas
1
Ja, ich habe auch Rays Antwort positiv bewertet. Ich freue mich, eine konkurrierende Antwort zu bewerten, wenn es mir auch gefällt.
Michael Durrant
3
Ich denke, wir konkurrieren hier nicht, sondern helfen uns gegenseitig, oder? :)
witkacy26
Genau das, wonach ich gesucht habe, als ich versucht habe, ein Array aus einem Hash zu erstellen, indem ich seine Schlüssel als Werte verwende. Danke :)
Fabian Leutgeb
Nützlich, wenn Sie gleichzeitig eine Logik mit den Tasten ausführen müssen .
Chris Cirefice
22
hash.collect { |k, v| v }
#returns [["a", "b", "c"], ["b", "c"]] 

Enumerable#collectNimmt einen Block und gibt ein Array der Ergebnisse der einmaligen Ausführung des Blocks für jedes Element der Aufzählung zurück. Dieser Code ignoriert also nur die Schlüssel und gibt ein Array aller Werte zurück.

Das EnumerableModul ist ziemlich genial. Wenn Sie es gut wissen, können Sie viel Zeit und Code sparen.

Jergason
quelle
2
Vergessen Sie nicht, dass, wie die Antwort von @Ray Toal, hash.valueshier letztendlich die richtige Antwort ist.
Tadman
Oder hash.map(&:second):)
Jaap Haagmans
7
hash  = { :a => ["a", "b", "c"], :b => ["b", "c"] }
hash.values #=> [["a","b","c"],["b","c"]]
mrded
quelle
stackoverflow.com/posts/12771873/revisions wie Sie sehen können, war die Formatierung Ihres Codes weit entfernt
karlingen
4

Es ist so einfach wie

hash.values
#=> [["a", "b", "c"], ["b", "c"]]

Dies gibt ein neues Array zurück, das mit den Werten von Hash gefüllt ist

Wenn Sie dieses neue Array speichern möchten, tun Sie dies

array_of_values = hash.values
#=> [["a", "b", "c"], ["b", "c"]]

array_of_values
 #=> [["a", "b", "c"], ["b", "c"]]
Melissa Quintero
quelle
2

Es gibt auch diesen:

hash = { foo: "bar", baz: "qux" }
hash.map(&:last) #=> ["bar", "qux"]

Warum es funktioniert:

Der &Aufruf to_procdes Objekts und Übergabe als Block an die Methode.

something {|i| i.foo }
something(&:foo)
Karlingen
quelle
Eine ausführlichere Erklärung brianstorti.com/understanding-ruby-idiom-map-with-symbol
Sylvain