访问Ruby嵌套哈希中的元素

时间:2013-08-31 19:14:18

标签: ruby

我正在尝试访问嵌套哈希中的元素,其中键是相似的符号。

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返回Josh最喜欢的画家 - 同样的问题,我可以找到:name => Josh但不确定如何返回相应的画家。

提前致谢

2 个答案:

答案 0 :(得分:1)

就像我在评论中提到的那样,当它们变得太原始时,不要使用原语,呃,原始的。嵌套的任何事都暗示着你处于那个阶段:

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

答案 1 :(得分:1)

A1:

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

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

A2:

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