假设我有一个可能包含哈希值的哈希值.
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)
但这不会得到'用户'哈希的秘密.
我不认为有一个内置的方法,所以一个简单的递归方法沿着以下几行是一个解决方案:
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,其中排除了请求的键.
| 归档时间: |
|
| 查看次数: |
744 次 |
| 最近记录: |