Ruby Hash do tablicy wartości

118

Mam to:

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

i chcę do tego dojść: [["a","b","c"],["b","c"]]

Wygląda na to, że powinno działać, ale tak nie jest:

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

Jakieś sugestie?

tbrooke
źródło
Poniższe odpowiedzi są poprawne ( hash.valuesbędąc lepszą IMO). Ale chciałem zwrócić uwagę, że gdy podasz blok, po Hash#eachprostu zwróci pełną wartość skrótu. Jeśli chcesz wykonać operację na każdym elemencie i zwrócić to jako tablicę, użyj Hash#collectlub jego aliasu Hash#map. Więcej informacji o Enumerables tutaj .
brymck
3
To pytanie wygląda dziwnie znajomo ... Zastanawiam się, ile osób pracuje teraz nad tym samym zadaniem domowym.
Peter Brown

Odpowiedzi:

261

Również trochę prostsze ....

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

Dokument Ruby tutaj

Ray Toal
źródło
3
+! Świetnie! Zagłosuję za, mimo że mam konkurencyjną odpowiedź (używając map), bo bardzo mi się to podoba!
Michael Durrant
2
Hash#valuesjest nie tylko prostszy, ale i wydajniejszy. Porównaj time ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.values'ztime ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.map{|k,v| v}'
jordanbtucker
+1 (Oszołomiony niesamowicie po wypróbowaniu twojego kodu) Spędziłem jeden dzień bez powodzenia na usuwaniu indeksu wieloma metodami ... Wszystko, co mogę powiedzieć, bardzo dziękuję !!! : D
Rzymian 8.38-39
2
Czy klucze są drukowane w dokładnej kolejności, w jakiej występują?
stack1
43

Użyłbym:

hash.map { |key, value| value }
Michael Durrant
źródło
3
Nie przegłosowałem tego, ale jest to bardziej skomplikowany odpowiednik Hash#values.
Mark Thomas
1
Tak, również głosowałem za odpowiedzią Raya. Chętnie zagłosuję za konkurencyjną odpowiedzią, kiedy mi się też podoba.
Michael Durrant
3
Myślę, że nie konkurujemy tutaj, ale pomagamy sobie nawzajem, prawda? :)
witkacy26
Dokładnie to, czego szukałem, próbując utworzyć tablicę z skrótu, używając jej kluczy jako wartości. Dzięki :)
Fabian Leutgeb
Przydatne, gdy musisz jednocześnie wykonać logikę za pomocą klawiszy .
Chris Cirefice,
23
hash.collect { |k, v| v }
#returns [["a", "b", "c"], ["b", "c"]] 

Enumerable#collectprzyjmuje blok i zwraca tablicę wyników wykonania bloku raz dla każdego elementu wyliczalnego. Więc ten kod po prostu ignoruje klucze i zwraca tablicę wszystkich wartości.

EnumerableModuł jest dość niesamowite. Znajomość tego może zaoszczędzić mnóstwo czasu i mnóstwo kodu.

jergason
źródło
2
Nie zapominaj, że podobnie jak odpowiedź @Ray Toal hash.valuesjest ostatecznie poprawną odpowiedzią tutaj.
tadman
Lub hash.map(&:second):)
Jaap Haagmans
4

To jest tak proste, jak

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

zwróci to nową tablicę wypełnioną wartościami z skrótu

jeśli chcesz zapisać tę nową tablicę, zrób to

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

array_of_values
 #=> [["a", "b", "c"], ["b", "c"]]
Melissa Quintero
źródło
2

Jest też ten:

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

Dlaczego to działa:

&Zwraca to_procsię na obiekcie, i przekazuje je jako blok do sposobu.

something {|i| i.foo }
something(&:foo)
karlingen
źródło
Bardziej szczegółowe wyjaśnienie brianstorti.com/understanding-ruby-idiom-map-with-symbol
Sylvain