清除嵌套ruby散列中的所有值

时间:2014-02-12 10:29:40

标签: ruby-on-rails ruby hash hashmap

如何从ruby中删除所有值。我不想只删除键值。

例如:

这是我的哈希:{'a'=>{'b'=>'c'},'d'=>'e','f'=>{'g'=>''}}

我想要这个:{'a'=>{'b'=>nil},'d'=>nil,'f'=>{'g'=>nil}}

我不想删除嵌套的哈希值。嵌套级别从一到六级不等

感谢名单

3 个答案:

答案 0 :(得分:6)

您可以编写自定义delete_values!方法,如下所示:

class Hash
  def delete_values!
    each_key do |key|
      self[key].is_a?(Hash) ? self[key].delete_values! : self[key] = nil
    end
  end
end

{'a'=>{'b'=>'c'},'d'=>'e','f'=>{'g'=>''}}.delete_values!
# => {"a"=>{"b"=>nil}, "d"=>nil, "f"=>{"g"=>nil}}

答案 1 :(得分:2)

h = {'a'=>{'b'=>'c'},'d'=>'e','f'=>{'g'=>''}}

def clean_hash h
 h.each do  |key, value| 
   if value.instance_of? Hash
     clean_hash value
   else
     h[key] = nil
   end
 end
end

clean_hash h
#{"a"=>{"b"=>nil}, "d"=>nil, "f"=>{"g"=>nil}}

答案 2 :(得分:1)

h = {'a'=>{'b'=>'c'},'d'=>'e','f'=>{'g'=>''}}

def cleaned_hash(h)
  h.reduce({}) do |memo, (key, val)|
    memo[key] = if val.is_a? Hash
                  cleaned_hash(val)
                else
                  nil
                end
    memo
  end
end

cleaned_hash h
# => {"a"=>{"b"=>nil}, "d"=>nil, "f"=>{"g"=>nil}}

这不会修改您的哈希值,而是为您提供已清理的副本