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?
hash.values
die bessere IMO). Aber ich wollte darauf hinweisen, wenn Sie einen Block dafür bereitstellen,Hash#each
wird 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 SieHash#collect
oder deren AliasHash#map
. Mehr zu Enumerables hier .Antworten:
Auch ein bisschen einfacher ....
Ruby doc hier
quelle
map
) upvoten , weil mir das sehr gefällt!Hash#values
ist nicht nur einfacher, sondern auch effizienter. Vergleichetime 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}'
Ich würde ... benutzen:
quelle
Hash#values
.Enumerable#collect
Nimmt 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
Enumerable
Modul ist ziemlich genial. Wenn Sie es gut wissen, können Sie viel Zeit und Code sparen.quelle
hash.values
hier letztendlich die richtige Antwort ist.hash.map(&:second)
:)quelle
Es ist so einfach wie
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
quelle
Es gibt auch diesen:
Warum es funktioniert:
Der
&
Aufrufto_proc
des Objekts und Übergabe als Block an die Methode.quelle