2014-11-04 64 views
0

我在红宝石中有嵌套哈希值,我需要访问它的特定值。我的哈希看起来像下面。在红宝石中访问哈希值散列值

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"]} 

但它返回了密钥列表。即0和1

请帮忙。

+0

由于您的键是字符串,这会工作:'h.to_s.scan(/(<=\"Type\"=> \”? )[^ \“] + /)=> [”剪辑“,”程序“](但我不会那样做)。 – 2014-11-06 05:25:57

回答

3
hash["list"].map {|_, hash| hash['Type']} 

说明:

hash = {key: 'value'} 

您可以遍历一个哈希使用each这样的:

hash.each {|pair| puts pair.inspect } #=> [:key, 'value'] 

或类似这样的

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

由于我们没有使用关键在任何地方,某些地方e IDE会抱怨未使用的本地变量key。为了防止出现这种情况,Ruby变体使用_作为变量名称,所有IDE都不会在意它未被使用。

+0

太棒了。虽然我不确定它是如何工作的以及地图块内发生了什么,但我喜欢它。我在哪里可以找到它的文档/参考链接(| _,hash |),以便我能理解它。 – rubyist 2014-11-04 12:53:48

2
hash['list'].collect { |_, value| value['Type'] } 
=> ["Clip", "Program"] 
0

这是跟随你的逻辑(一些答案张贴不同的方式来做到这一点)。为什么你去的东西错了,如果我们走一步看一步的原因是:

hash_type = hash["list"].keys #=> ["0", "1"] 

所以一切后是一样的,如:

["0", "1"].each {|key| puts key["Type"]} 

所以你基本上是在做放'1'['Type']'0'['Type']这都评估为nil(在IRB中试用)。尝试用p替换puts,然后您将打印2次为零。你得到hash_type为[“0”,“1”]的原因是因为你的最后一个表达式是keys.eacheach总是返回“接收者”,也就是你称之为each的数组(正如我们前面看到的,该数组是[“0”,“1”])。

解决这个问题的关键是,按照你的特定逻辑,把“键”(在这个例子中是'0'和'1')放在适当的上下文中,并把它们放在上下文中看起来像这样:

hash_type = hash["list"].keys.each {|key| puts hash["list"][key]["Type"]}` 

这将打印密钥。但是,hash_type仍然是[“0”,“1”](请记住,each返回接收器的值)。如果你想存储在hash_types实际类型的值,用map取代each和删除puts

hash_type = hash["list"].keys.map {|key| hash["list"][key]["Type"]} #=> ["Clip", "Program"] 
+0

这仍然不会返回OP所需的内容('hash_type'包含密钥列表) – 2014-11-04 12:51:37

+0

我更新了我的答案。 – daremkd 2014-11-04 12:56:13

+0

这也有效。我假定当你传递hash [“list”]。keys的每个键时,我们就可以像访问常规散列那样访问键[“Type”]。 – rubyist 2014-11-04 12:59:31