how do i loop over a hash of hashes in ruby

前端 未结 5 881
故里飘歌
故里飘歌 2020-12-13 05:32

OK so i have this hash

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

>  h.each do |key, value|
>     puts key
>   p         


        
相关标签:
5条回答
  • 2020-12-13 05:57

    The simplest way to separate out all three values in this case would be as follows:

    h.each do |key, value|
      puts key
      puts value[:link]
      puts value[:size]
    end
    
    0 讨论(0)
  • 2020-12-13 06:00

    You'll want to recurse through the hash, here's a recursive method:

    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
    

    You can Then take any hash and pass it in:

    h = {
        "x" => "a",
        "y" => {
            "y1" => {
                "y2" => "final"
            },
            "yy1" => "hello"
        }
    }
    ihash(h)
    
    0 讨论(0)
  • 2020-12-13 06:00

    You can access the values of a hash directly by calling hash.values. In this case you could do something like

    > h = {"67676.mpa"=>{:link=>"pool/sdafdsaff", :size=>4556}}
    > h.values.each do |key, value|
    >   puts "#{key} #{value}"
    > end
    
    link pool/sdafsaff
    size 4556
    
    0 讨论(0)
  • 2020-12-13 06:04

    I little improved Travis's answer, how about this 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
    }
    
    0 讨论(0)
  • 2020-12-13 06:08

    Value is a Hash to so you need iterate on it or you can get only values:-

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

    or

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

    0 讨论(0)
提交回复
热议问题