在ruby中访问哈希值的哈希

在ruby中访问哈希值的哈希,ruby,Ruby,我在ruby中有一个嵌套哈希,我需要访问它的特定值。我的哈希如下所示 hash = {"list"=> {"0"=> {"date"=>"11/03/2014", "item1"=>"", "tiem2"=>"News", "item3"=>"", "item4"=>"", "item5"=>"Videos",

我在ruby中有一个嵌套哈希,我需要访问它的特定值。我的哈希如下所示

hash = 

    {"list"=>
      {"0"=>
        {"date"=>"11/03/2014",
         "item1"=>"",
         "tiem2"=>"News",
         "item3"=>"",
         "item4"=>"",
         "item5"=>"Videos",
         "Type"=>"Clip"},
       "1"=>
         {"date"=>"11/03/2014",
         "item1"=>"",
         "tiem2"=>"News",
         "item3"=>"",
         "item4"=>"",
         "item5"=>"Videos",
         "Type"=>"Program"}
    }}
我需要访问每个键的类型值。 我尝试了下面的代码,但我不知道为什么它不起作用

hash_type = hash["list"].keys.each {|key| puts key["Type"]}
但它返回了密钥列表。i、 e 0和1

请帮忙

hash["list"].map {|_, hash| hash['Type']}
说明:

hash = {key: 'value'}
您可以使用如下方式循环哈希:

hash.each {|pair| puts pair.inspect }    #=> [:key, 'value']
hash_type = hash["list"].keys.each {|key| puts hash["list"][key]["Type"]}` 
还是像这样

hash.each {|key, value| puts "#{key}: #{value}"} #=> key: value
由于我们在任何地方都不使用key,一些ide会抱怨未使用的局部变量key。为了防止这种情况,ruby的惯例是使用u作为变量名,所有的IDE都不希望它被不用

hash['list'].collect { |_, value| value['Type'] }
 => ["Clip", "Program"]
说明:

hash = {key: 'value'}
您可以使用如下方式循环哈希:

hash.each {|pair| puts pair.inspect }    #=> [:key, 'value']
hash_type = hash["list"].keys.each {|key| puts hash["list"][key]["Type"]}` 
还是像这样

hash.each {|key, value| puts "#{key}: #{value}"} #=> key: value

由于我们在任何地方都不使用key,一些ide会抱怨未使用的局部变量key。为了防止这种情况,ruby的惯例是使用uu作为变量名,所有IDE都不希望它被不用。

这是按照您的逻辑进行的,一些答案给出了不同的方法。如果我们一步一步走,你会出错的原因是:

hash['list'].collect { |_, value| value['Type'] }
 => ["Clip", "Program"]
hash_type = hash["list"].keys #=> ["0", "1"]
所以之后的一切都是一样的:

["0", "1"].each {|key| puts key["Type"]}
所以你基本上是在做puts'1'['Type']和'0'['Type']这两个都计算为零的puts,然后在IRB中尝试。尝试用p替换PUT,您将得到2次零打印。之所以将hash_type设置为[0,1],是因为您的最后一个表达式是keys。每个表达式都始终返回receiver,即您调用每个表达式的数组,正如我们前面看到的,该数组是[0,1]

按照您的特定逻辑解决此问题的关键是将此实例中的“0”和“1”键置于适当的上下文中,并将它们置于上下文中,如下所示:

hash.each {|pair| puts pair.inspect }    #=> [:key, 'value']
hash_type = hash["list"].keys.each {|key| puts hash["list"][key]["Type"]}` 
这将打印钥匙。但是,hash_类型仍然是[0,1]记住,每个都返回接收方的值。如果要将实际类型值存储在哈希_类型中,请将每个类型值替换为map和remove put:


这是按照你的逻辑来做的。一些答案用不同的方法来做。如果我们一步一步走,你会出错的原因是:

hash_type = hash["list"].keys #=> ["0", "1"]
所以之后的一切都是一样的:

["0", "1"].each {|key| puts key["Type"]}
所以你基本上是在做puts'1'['Type']和'0'['Type']这两个都计算为零的puts,然后在IRB中尝试。尝试用p替换PUT,您将得到2次零打印。之所以将hash_type设置为[0,1],是因为您的最后一个表达式是keys。每个表达式都始终返回receiver,即您调用每个表达式的数组,正如我们前面看到的,该数组是[0,1]

按照您的特定逻辑解决此问题的关键是将此实例中的“0”和“1”键置于适当的上下文中,并将它们置于上下文中,如下所示:

hash.each {|pair| puts pair.inspect }    #=> [:key, 'value']
hash_type = hash["list"].keys.each {|key| puts hash["list"][key]["Type"]}` 
这将打印钥匙。但是,hash_类型仍然是[0,1]记住,每个都返回接收方的值。如果要将实际类型值存储在哈希_类型中,请将每个类型值替换为map和remove put:


这仍然不会返回OP所需的内容。哈希类型最终包含同样有效的键列表。我的假设是,当您传递hash[list].keys的每个键时,我们将能够像在普通hash中一样访问键[Type]。这仍然不会返回OP需要的内容。hash_Type最终包含同样有效的键列表。我的假设是,当你传递hash[list].keys的每个键时,我们就可以像在普通hash中一样访问key[Type]。这太棒了。虽然我不知道它是如何工作的,以及在地图块中发生了什么,但我喜欢它。我在哪里可以找到它的文档/参考链接| | | |,hash |,这样我就可以理解它了。太棒了。虽然我不知道它是如何工作的,以及在地图块中发生了什么,但我喜欢它。我在哪里可以找到它的文档/参考链接| |,hash |,这样我就可以理解它。因为你的键是字符串,这将起作用:h.to|s.scan/?\[^\]+/=>[Clip,Program],但我不会那样做。因为你的键是字符串,这将起作用:h.to|s.scan/?\[^\]+/=>[Clip,Program],但我不会那样做。