以不规则的哈希方式获取电子邮件列表

时间:2013-02-27 14:37:04

标签: ruby

我有params哈希,它是由哈希哈希组成的,有时,哈希有一封电子邮件。获取所有电子邮件的最佳方式是什么?参数可能比3级更深。我只达到了每个参数,但我无法弄清楚如何进行嵌套搜索

params = {
  :email => 'foo@bar.com', 
  :name => 'foo bar',
  '0' => {
    :name => 'My Name',
    :email => 'my@name.com',
    '0' => {
      :name => 'Another Name',
      :email => 'another@name.com'
    }
  }
}

2 个答案:

答案 0 :(得分:1)

有点hackish但你可以做以下(未经测试)。如果您需要在数组中使用它们,则可以在方法外声明一个实例变量,只需使用它代替puts v

def get_email(hash)
  hash.each do |k,v|
    if v.is_a?(Hash)
      get_email v
    elsif k.to_sym == :email
      puts v
    end 
  end 
end

答案 1 :(得分:0)

Monkeypatching Hash类它将是:

class Hash
  def find_all key  
    self.map { |k, v|
      v.is_a?(Hash) ? v.find_all(key) : (v if k.to_sym == key.to_sym) 
    }.flatten.compact    
  end  
end  
# ⇒ nil

> params.find_all :email
# ⇒ [
#  [0] "foo@bar.com",
#  [1] "my@name.com",
#  [2] "another@name.com"
# ]