Я пытаюсь написать метод, который удаляет все ключи во вложенном хэше, которые указывают на ноль рекурсивно.
Например:
{:a=>nil, :b=>"b", :c=>nil, :d=>{:dd=>"dd", :ee=>nil, :ff=>"ff"}, :e=>{:gg=>nil, :hh=>nil}}
становится:
{:b=>"b", :d=>{:dd=>"dd", :ff=>"ff"}}
Мне не очень повезло.
Моя последняя попытка выглядит так:
def deep_compact(hash)
hash.reject do |key, value|
deep_compact(value) if value.class == Hash
next true if value.nil? || value.empty?
end
end
Здесь я хочу перебрать каждую пару значений ключа в хэше.Если значение является хешем, я хочу сделать то же самое для этого хеша.Я хочу отклонить пару, если значение равно нулю или пусто.В противном случае я хочу сохранить его.
Результат не тот, который я хочу:
#=> {:b=>"b", :d=>{:dd=>"dd", :ee=>nil, :ff=>"ff"}, :e=>{:gg=>nil, :hh=>nil}}
Я также пытался:
def deep_compact(hash)
hash.compact.transform_values do |value|
deep_compact(value) if value.class == Hash
value
end
end
Опять получаютот же результат:
#=> {:b=>"b", :d=>{:dd=>"dd", :ee=>nil, :ff=>"ff"}, :e=>{:gg=>nil, :hh=>nil}}
Это заставляет меня поверить, что либо я что-то упустил, либо мое понимание рекурсии неверно.
Близки ли мои попытки?Что мне нужно сделать, чтобы получить желаемый результат: {:b=>"b", :d=>{:dd=>"dd", :ff=>"ff"}}
?