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

Ste*_*evo 4 ruby

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

params: { :action => "index", :controller => "home", 
          :secret => "I love Jeff Atwood",
          :user => {name => "Steve", secret => "I steal Joel's pants"}}
Run Code Online (Sandbox Code Playgroud)

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

我知道我能做到

params.delete(:secret)
Run Code Online (Sandbox Code Playgroud)

但这不会得到'用户'哈希的秘密.

mik*_*kej 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
Run Code Online (Sandbox Code Playgroud)

使用您的示例数据:

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
Run Code Online (Sandbox Code Playgroud)

得到:

{:controller=>"home", :user=>{:name=>"Steve"}, :action=>"index"}
Run Code Online (Sandbox Code Playgroud)

请注意,此解决方案可以正常工作,即它正在修改原始Hash,而不是返回一个新的Hash,其中排除了请求的键.