web-dev-qa-db-fra.com

comment puis-je boucle sur un hachage de hachages dans ruby

Ok donc j'ai ce hash

 h
 => {"67676.mpa"=>{:link=>"pool/sdafdsaff", :size=>4556}} 

>  h.each do |key, value|
>     puts key
>   puts value
>   end
67676.mpa
linkpool/sdafdsaffsize4556

comment puis-je accéder aux valeurs séparées dans la valeur hash de la boucle

72
Matt Elhotiby

La valeur est un hachage, vous devez donc l'itérer ou vous ne pouvez obtenir que des valeurs: -

h.each do |key, value|
  puts key
  value.each do |k,v|
    puts k
    puts v
  end
end

ou

h.each do |key, value|
  puts key
  value.values.each do |v|
    puts v
  end
end
146
shingara

Vous aurez envie de récidiver à travers le hash, voici une méthode récursive:

def ihash(h)
  h.each_pair do |k,v|
    if v.is_a?(Hash)
      puts "key: #{k} recursing..."
      ihash(v)
    else
      # MODIFY HERE! Look for what you want to find in the hash here
      puts "key: #{k} value: #{v}"
    end
  end
end

Vous pouvez ensuite prendre n'importe quel hash et le transmettre:

h = {
    "x" => "a",
    "y" => {
        "y1" => {
            "y2" => "final"
        },
        "yy1" => "hello"
    }
}
ihash(h)
17
Travis Reeder

J'ai un peu amélioré la réponse de Travis, qu'en est-il de ce Gist:

https://Gist.github.com/kjakub/be17d9439359d14e6f86

class Hash

  def nested_each_pair
    self.each_pair do |k,v|
      if v.is_a?(Hash)
        v.nested_each_pair {|k,v| yield k,v}
      else
        yield(k,v)
      end
    end
  end

end

{"root"=>{:a=>"tom", :b=>{:c => 1, :x => 2}}}.nested_each_pair{|k,v|
  puts k
  puts v
}
7
Jakub Kuchar

Le moyen le plus simple de séparer les trois valeurs dans ce cas serait le suivant:

h.each do |key, value|
  puts key
  puts value[:link]
  puts value[:size]
end
4
Jeremy Lynch

Vous pouvez accéder directement aux valeurs d’un hachage en appelant hash.values. Dans ce cas, vous pourriez faire quelque chose comme

> h = {"67676.mpa"=>{:link=>"pool/sdafdsaff", :size=>4556}}
> h.values.each do |key, value|
>   puts "#{key} #{value}"
> end

link pool/sdafsaff
size 4556
2
roo