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?


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


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 }

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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.