【问题标题】:How do I loop over a hash of hashes?如何循环哈希哈希?
【发布时间】:2012-03-05 23:47:05
【问题描述】:

我有这个哈希:

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

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

如何访问循环中值散列中的单独值?

【问题讨论】:

  • 您希望看到什么输出?
  • appcoach shingara 使用的效果很好......我必须画一个空白......答案就在我面前......我必须做一个内部循环
  • 众所周知,puts 对 hash 的输出毫无用处,你试过“puts hash.inspect”吗?

标签: ruby-on-rails ruby hash


【解决方案1】:

Value 是一个 Hash,因此您需要对其进行迭代,否则您只能获取值:-

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

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

【讨论】:

  • 如果密钥没有在任何地方使用怎么办? .我们需要用? 代替 key 吗?例如:|?, array| 这是Ruby 的有效语法吗?
  • @huzefabiyawarwala 如果在迭代中未使用密钥,则应在其前面加上下划线,如 |_key, value|
【解决方案2】:

你会想要通过哈希进行递归,这里有一个递归方法:

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

然后你可以取任意散列并传入:

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

【讨论】:

  • 如果密钥没有在任何地方使用怎么办? .我们需要用? 代替 key 吗?例如:|?, array| 这是有效的语法吗?
  • 保留它,只是不要使用它。问号无效。
【解决方案3】:

我对 Travis 的回答稍有改进,这个要点怎么样:

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
}

【讨论】:

  • @Travis R 改进答案
【解决方案4】:

在这种情况下,分离所有三个值的最简单方法如下:

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

【讨论】:

    【解决方案5】:

    您可以通过调用hash.values 直接访问哈希值。在这种情况下,您可以执行类似的操作

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

    【讨论】:

      猜你喜欢
      • 2014-11-14
      • 2011-05-27
      • 2010-12-19
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 2011-04-20
      相关资源
      最近更新 更多