2013-08-31 86 views
0

我想访问嵌套散列中的元素,其中键是相似的符号。红宝石嵌套散列中的访问元素

favs = { 
    :art => "painters", 
    :survey1 => [ 
    {:name => "Josh", :painter => "Dali" }, 
    {:name => "Mona", :painter => "Monet"} 
    ], 
    :survey2 => [ 
    {:name => "Leon", :answer => "None"}, 
    {:name => "Port", :answer => "Picasso"}, 
    ] 
} 

Q1:删除Leon-

我想出了这一点:

favs[:survey2].each { |hash| 
hash.delete_if { |k,v| 
v=="Leon" 
} 
} 

,但我无法弄清楚如何配合第二键值对的(接听/画家)删除后只是名称。

Q2返回乔希最喜欢的画家 - 同样的问题,我可以找到:姓名=>乔希但不知道如何返回相应的画家。

在此先感谢

+1

通过一个问题我的答案是,你为什么要使用嵌套哈希?相反,创建一个对象,原语就是这样,原始的。 – iain

+0

[在红宝石中嵌套哈希的元素的可能的重复](http://stackoverflow.com/questions/5544858/accessing-elements-of-nested-hashes-in-ruby) – anon

回答

1

A1:

您必须删除数组中的哈希值,而不是哈希中的元素。

favs[:survey2].delete_if {|i| i[:name] == "Leon"} 

A2:

favs[:survey1].find { |i| i[:name] == "Josh" }[:painter] 
1

就像我在评论中提到,不要当他们成为过,呃,原始使用原始的。嵌套anythings是你在这个阶段的提示:

class Student 
    attr_reader :name 
    attr_reader :favourite_painter 

    def initialize(name, opts={}) 
    @name = name 
    @favourite_painter = opts[:favourite_painter] 
    end 
end 

students = [] 
students << Student.new("Josh", :favourite_painter => "Dali") 
students << Student.new("Mona", :favourite_painter => "Monet") 
# etc… 

而看到http://www.ruby-doc.org/core-2.0/Array.htmlhttp://www.ruby-doc.org/core-2.0/Enumerable.html

+0

这是一个练习,这些都是问题我需要解决。我没有编写散列本身。 在你的答案中,我不确定学生是指什么。 – icecreamsoda

+0

你发布的内容似乎是学生(或人)和他们最喜欢的画家列表。乔希是一名学生,他最喜欢的画家是达利。学生是一个为保存数据而创建的类,正如我之前所说的那样,将数据放入嵌套哈希中会让您自己难过。我不确定练习的目的是什么,是通过一个你可能不会遇到的结构学习缓冲,因为你不会创建一个这样的结构,还是要学习Ruby?这就是为什么Ruby不像Perl那样使用类来烘焙类的原因,这样做更容易。 – iain