有一种优雅的方法可以从哈希中删除特定的键,它是Ruby中的子哈希

时间:2010-07-08 08:41:10

标签: ruby

假设我有一个可能包含哈希值的哈希值。

params: { :action => "index", :controller => "home", 
          :secret => "I love Jeff Atwood",
          :user => {name => "Steve", secret => "I steal Joel's pants"}}

是否有一种优雅的方式来遍历哈希并删除我遇到的所有“秘密”密钥,包括subhashes。 (哈希不受限制,所以无法预先知道哈希可能含有什么。)

我知道我能做到

params.delete(:secret)

但是这不会从'用户'哈希获得秘密。

1 个答案:

答案 0 :(得分:7)

我认为没有内置的方法,因此沿着以下几行的简单递归方法是一种解决方案:

def recursive_delete(hash, to_remove)
  hash.delete(to_remove)
  hash.each_value do |value|
    recursive_delete(value, to_remove) if value.is_a? Hash
  end
end

使用您的示例数据:

h = { :action => "index", :controller => "home", :secret => "I love Jeff Atwood",
          :user => {:name => "Steve", :secret => "I steal Joel's pants"}}

recursive_delete(h, :secret)

puts h.inspect

给出:

{:controller=>"home", :user=>{:name=>"Steve"}, :action=>"index"}

请注意,此解决方案可以正常工作,即它正在修改原始哈希,而不是返回一个新的哈希,并且排除了请求的密钥。