2010-08-16 20 views
7
{"Journal"=>[[4, -785.0], 
      [13, -21.9165000915527], 
      [14, -213.008995056152], 
      [15, -50.074499130249]]} 

Come si può iterare questo hash in Ruby e come si desidera separare i valori delle chiavi &?iterazione raccolta hash

+0

se avete bisogno di scorrere un HashMap, si sono forse usando il contenitore sbagliato – Scoregraphic

+0

@Scoregraphic - non necessariamente - questo non è poi così raro. Esempio: serializzazione dei dati. –

+0

Aspetta, hai un hash con una singola coppia chiave/valore il cui valore è una matrice di matrici? – haffax

risposta

14
myHash.each do |key, value| 
    // key holds the key, value holds the value 
end 

Nel caso in cui si desidera trasformare l'array all'interno dell'array a una mappa fare questo:

myNewHash = {} 
myArrayOfArrays = myHash["Journal"] 
myArrayOfArrays.each do | item | 
    myNewHash[item[0]] = item[1] 
end 
21

Ruby ha un'interfaccia di iterazione uniforme. Tutte le raccolte in Ruby hanno un metodo chiamato each, che consente di scorrere su ogni elemento della raccolta. Si noti, tuttavia, che l'iterazione esplicita è un odore di codice. Dovresti utilizzare principalmente iteratori di livello superiore come map, reduce, select, find, reject e così via.

In questo caso particolare in cui la raccolta è un Hash, ciascun elemento che viene ceduto al blocco, è un array di due elementi che costituiscono la chiave e il valore:

print hsh.reduce('') {|s, el| 
    s << "The key is #{el.first} and the value is #{el.last}.\n" 
} 

Grazie alla destrutturazione di rubino si legano, si può semplicemente legare i due elementi della matrice a due variabili nel blocco e non avrà la necessità di tenere costantemente la matrice a parte:

print hsh.reduce('') {|s, (k, v)| 
    s << "The key is #{k} and the value is #{v}.\n" 
}