2012-03-05 11 views
91

mam to:Ruby Hash do tablicy wartości

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

i chcę się do tego: [["a","b","c"],["b","c"]]

Wydaje się, że powinna działać, ale tak nie jest:

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

Wszelkie sugestie?

+0

Poniższe odpowiedzi są poprawne ("wartości hasz" są lepszym IMO). Ale chciałem wskazać, kiedy podasz blok "Hash # each", po prostu zwróci pełną wartość skrótu. Jeśli chcesz wykonać operację na każdym elemencie i zwrócić ją jako tablicę, użyj 'Hash # collect' lub jego aliasu' Hash # map'. Więcej rzeczy na temat Enumerables [tutaj] (http://ruby-doc.org/core-1.9.3/Enumerable.html). – brymck

+3

To pytanie wygląda dziwnie znajomo ... Zastanawiam się, ilu ludzi pracuje obecnie nad tym samym zadaniem domowym. –

Odpowiedz

205

Również nieco prostsze ....

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

Ruby doc here

+3

+! Sprytny! Będę przegłosować pomimo posiadania konkurencyjnej odpowiedzi (używając 'map'), bo bardzo mi się to podoba! –

+2

'Hash # values' jest nie tylko prostsza, ale wydajniejsza. Porównaj 'time ruby ​​-e '(1..1000000) .reduce ({}) {| h, i | h.store i, i; h} .values'' z 'time ruby ​​-e '(1..1000000) .reduce ({}) {| h, i | h.store i, i; h} .map {| k, v | v} '' – jordanbtucker

+0

+1 (Zadziwiony zadziwiająco po tym, jak wypróbowałem twój kod) Spędziłem jeden dzień bez powodzenia usuwając indeks używając wielu metod ... Wszystko, co mogę powiedzieć, dziękuję bardzo !!! : D –

20
hash.collect { |k, v| v } 
#returns [["a", "b", "c"], ["b", "c"]] 

Enumerable#collect przyjmuje blok i zwraca tablicę wyników działania bloku raz w każdym elemencie enumerable. Więc ten kod po prostu ignoruje klucze i zwraca tablicę wszystkich wartości.

Moduł Enumerable jest całkiem niezły. Świadomość tego dobrze może zaoszczędzić mnóstwo czasu i mnóstwo kodu.

+1

Nie zapominaj, że podobnie jak odpowiedź @Ray Toal, "hash.values" jest ostatecznie poprawną odpowiedzią tutaj. – tadman

+0

Lub 'hash.map (&: second)' :) –

32

użyłbym:

hash.map { |key, value| value } 
+0

zaskoczony na dole! To działa. Próbowałem tego! –

+2

Nie przesłałem tego, ale jest to bardziej skomplikowany odpowiednik wartości "Hash #". –

+1

Tak, ja również przejąłem odpowiedź Raya. Cieszę się, że mogę wygrać konkurencyjną odpowiedź, gdy mi się to podoba. –

5
hash = { :a => ["a", "b", "c"], :b => ["b", "c"] } 
hash.values #=> [["a","b","c"],["b","c"]] 
+0

@karlingen, dlaczego zaktualizowałeś mój komentarz? – mrded

+0

http://stackoverflow.com/posts/12771873/revisions, jak widzisz, formatowanie twojego kodu było bardzo odległe. – karlingen

2

Istnieje również ten:

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

Dlaczego to działa:

& dzwoni pod numer to_proc i przekazuje go jako blok do metody.

something {|i| i.foo } 
something(&:foo) 
+0

Dlaczego spadły? – karlingen

+0

To działa. oddany głos :) – kuboon

+0

jak to działa, czy możesz wyjaśnić proszę – jenuine

2

Jest to tak proste, jak

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

będzie to powrót nową tablicę wypełniona wartościami z hash

jeśli chcesz zapisać tę nową tablicę zrobić

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

array_of_values 
#=> [["a", "b", "c"], ["b", "c"]] 
Powiązane problemy