Есть ли элегантный способ удалить определенный ключ из хеша и его подхешей в Ruby - PullRequest
4 голосов
/ 08 июля 2010

Допустим, у меня есть хэш, который может содержать хэши.

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

Есть ли элегантный способ перебрать хэш и удалить все «секретные» ключи, с которыми я сталкиваюсь, включая подшашки.(Хэши не ограничены, поэтому невозможно заранее знать, что они могут содержать.)

Я знаю, что могу сделать

params.delete(:secret)

, но это не даст секрет отхэш 'user'.

1 Ответ

7 голосов
/ 08 июля 2010

Я не думаю, что есть встроенный метод для этого, поэтому простой рекурсивный метод в следующих строках является одним из решений:

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"}

Обратите внимание, что это решение работает на месте, т. Е. Оно модифицирует исходный хеш, а не возвращает новый хеш с исключенным запрошенным ключом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...