È possibile accedere all'indice in un hash ogni ciclo?


119

Probabilmente mi manca qualcosa di ovvio, ma c'è un modo per accedere all'indice / conteggio dell'iterazione all'interno di un hash ogni ciclo?

hash = {'three' => 'one', 'four' => 'two', 'one' => 'three'}
hash.each { |key, value| 
    # any way to know which iteration this is
    #   (without having to create a count variable)?
}

3
Anon: No, gli hash non vengono ordinati.
Mikael S

gli hash non sono tecnicamente ordinati, ma in ruby ​​puoi ordinarli in un certo senso. sort () li convertirà in un array nidificato ordinato, che puoi quindi riconvertire in un hash: your_hash.sort.to_h
jlesse

Risposte:


296

Se ti piace conoscere l'indice di ogni iterazione potresti usare .each_with_index

hash.each_with_index { |(key,value),index| ... }

24
hash.each_with_index { |(key,value),index| ... }
rampion

22
le parentesi sono necessarie b / c hash.eachfornisce ogni coppia chiave-valore in un Array. I genitori fanno la stessa cosa di (key,value) = arrmettere il primo valore (la chiave) in keye il secondo in value.
rampion

1
Grazie @ S.Mark, @rampion, che ha funzionato. Non ho visto each_with_indexelencato nella RDoc per Hash: ruby-doc.org/core/classes/Hash.html . Ora vedo che è un membro di Enumerable. Ma peccato che RDoc non possa incrociare il riferimento each_with_indexda Hash.html.
Aggiornamento del

2
@Dave_Paroulek ho desiderato spesso lo stesso. Ho trovato il controllo manuale dei moduli genitore un passaggio necessario quando si utilizza vi per controllare i metodi di una classe. Spesso passo a irb, e uso ClassName#instance_methodsper assicurarmi che non mi sia perso nulla.
rampion

Grazie, @rampion, ClassName#instance_methodsè stato molto utile
Aggiornamento da

11

Puoi iterare sulle chiavi e ottenere i valori manualmente:

hash.keys.each_with_index do |key, index|
   value = hash[key]
   print "key: #{key}, value: #{value}, index: #{index}\n"
   # use key, value and index as desired
end

EDIT: secondo il commento di rampion, ho anche appena imparato che puoi ottenere sia la chiave che il valore come una tupla se ripeti hash:

hash.each_with_index do |(key, value), index|
   print "key: #{key}, value: #{value}, index: #{index}\n"
   # use key, value and index as desired
end

Downvoted per accedere alla raccolta iterata dall'interno del ciclo e un codice errato: keynel primo ciclo c'è un array di coppia chiave + valore, quindi usarlo come indice in hashè sbagliato. L'hai mai provato?
SasQ
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.