Ruby Hash su array di valori


118

Ho questo:

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

e voglio arrivare a questo: [["a","b","c"],["b","c"]]

Sembra che dovrebbe funzionare ma non è così:

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

Eventuali suggerimenti?


Le risposte seguenti sono corrette ( hash.valuesessendo il migliore IMO). Ma volevo sottolineare che quando fornisci un blocco Hash#eachrestituirà solo il valore completo dell'hash. Se vuoi eseguire un'operazione su ogni elemento e restituirlo come array, usa Hash#collecto il suo alias Hash#map. Altre cose su Enumerables qui .
Brymck

3
Questa domanda sembra stranamente familiare ... Mi chiedo quante persone stiano lavorando allo stesso compito a casa in questo momento.
Peter Brown

Risposte:


261

Inoltre, un po 'più semplice ...

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

Ruby doc qui


3
+! Nifty! Voterò nonostante abbia una risposta competitiva (usando map), perché mi piace molto!
Michael Durrant

2
Hash#valuesnon è solo più semplice, ma anche più efficiente. Confronta time ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.values'contime ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.map{|k,v| v}'
jordanbtucker

+1 (stupefatto dopo aver provato il tuo codice) Ho passato un giorno senza fortuna a rimuovere l'indice usando molti metodi ... Tutto quello che posso dire grazie mille !!! : D
Romani 8,38-39

2
Le chiavi sono stampate nell'ordine esatto in cui si trovano?
stack1

43

Io userei:

hash.map { |key, value| value }

3
Non l'ho sottovalutato, ma è un equivalente più complicato di Hash#values.
Mark Thomas

1
Sì, ho anche votato positivamente la risposta di Ray. Sono felice di votare una risposta competitiva quando piace anche a me.
Michael Durrant

3
Penso che non stiamo gareggiando qui ma ci aiutiamo a vicenda, giusto? :)
witkacy26

Esattamente quello che stavo cercando quando cercavo di creare un array da un hash usando le sue chiavi come valori. Grazie :)
Fabian Leutgeb

Utile quando devi fare anche un po 'di logica con i tasti allo stesso tempo.
Chris Cirefice

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

Enumerable#collectprende un blocco e restituisce un array dei risultati dell'esecuzione del blocco una volta su ogni elemento dell'enumerabile. Quindi questo codice ignora le chiavi e restituisce un array di tutti i valori.

Il Enumerablemodulo è davvero fantastico. Conoscerlo bene può farti risparmiare molto tempo e molto codice.


2
Non dimenticare che, come la risposta di @Ray Toal, in hash.valuesdefinitiva è la risposta corretta qui.
tadman

Oppure hash.map(&:second):)
Jaap Haagmans


4

È semplice come

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

questo restituirà un nuovo array popolato con i valori di hash

se vuoi memorizzare quel nuovo array fallo

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

array_of_values
 #=> [["a", "b", "c"], ["b", "c"]]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.