假设我有一个可能包含哈希值的哈希值。
params: { :action => "index", :controller => "home",
:secret => "I love Jeff Atwood",
:user => {name => "Steve", secret => "I steal Joel's pants"}}
是否有一种优雅的方式来遍历哈希并删除我遇到的所有“秘密”密钥,包括subhashes。 (哈希不受限制,所以无法预先知道哈希可能含有什么。)
我知道我能做到
params.delete(:secret)
但是这不会从'用户'哈希获得秘密。
答案 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"}
请注意,此解决方案可以正常工作,即它正在修改原始哈希,而不是返回一个新的哈希,并且排除了请求的密钥。