2013-02-25 7 views
5

Così con un hash normale è possibile utilizzare questo per ottenere le chiavi:Come posso ottenere le chiavi in ​​un hash multidimensionale in Ruby?

hash.keys 

Come posso ottenere le chiavi del 2 ° dimensione di un hash multidimensionale che assomiglia a questo:

{"<id>"=>{"first_name"=>"test", "last_name"=>"test_l", "username"=>"test_user", 
"title"=>"Sales Manager", "office"=>"test", "email"=>"[email protected]"}} 

<id> è unico per ogni oggetto.

Così le chiavi che voglio da sopra sono: first_name, last_name, username, title, office and email

risposta

2

Supponendo di avere un hash che ha una chiave sconosciuta con un valore: un hash.

h = {"<id>"=>{"first_name"=>"test", "last_name"=>"test_l", "username"=>"test_user", 
"title"=>"Sales Manager", "office"=>"test", "email"=>"[email protected]"}} 

p h[h.keys.first].keys 
#=> ["first_name", "last_name", "username", "title", "office", "email"] 

(Ma ogni volta che vedo un costrutto come questo mi chiedo perché non è una Struct).

4

Si potrebbe fare qualcosa di simile:

hash["<id>"].keys 
+0

'hash [" "] .keys' è più corretto. L'OP mostra le chiavi come stringhe letterali. –

+0

Dapprima annotato. Grazie :) – BlackHatSamurai

+0

Intendi "Detto regolarmente" :) – zetetic

2

Di seguito si otterrebbe tutti i tasti utilizzati nel secondo hash livello. Ho usato uniq in modo da non ottenere duplicati.

hash.collect { |k, v| v.keys }.flatten.uniq 
+0

o 'hash.values.collect (&: keys) .flatten.uniq', che evita il blocco. –

+1

Se stai usando 'map' o' collect', è idiomatico usare '{' e '}' invece di 'do' e' end'. Questo è particolarmente vero quando si concatenano i metodi alla fine del blocco. Chaining to end è particolarmente brutto. –

+0

OK. L'ho modificato per usare le parentesi graffe. –

2

Suppongo si intenda che ci saranno diverse chiavi "id" univoche nell'hash base che puntano agli hash annidati che contengono ciascuno i tasti "first_name", "last_name", ecc. Se questo è il caso:

hash.values.map(&:keys) 

restituirà una matrice di matrici contenenti le chiavi di ciascun hash annidata.

D'altra parte, se si dispone di una sola coppia di valori-chiave (come nel tuo esempio), si potrebbe fare

hash.values.first.keys 

che restituire una matrice piatta di tasti corrispondenti a quelli della nidificata lone hash.

Problemi correlati