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?


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


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 }

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.


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


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"]]

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.