如何从ruby中删除所有值。我不想删除键值。清除嵌套红宝石散列中的所有值
例如:
这里是我的散列:{'a'=>{'b'=>'c'},'d'=>'e','f'=>{'g'=>''}}
我想这一点:{'a'=>{'b'=>nil},'d'=>nil,'f'=>{'g'=>nil}}
我不想删除嵌套的哈希值。嵌套级别从一到六个级别
感谢名单
如何从ruby中删除所有值。我不想删除键值。清除嵌套红宝石散列中的所有值
例如:
这里是我的散列:{'a'=>{'b'=>'c'},'d'=>'e','f'=>{'g'=>''}}
我想这一点:{'a'=>{'b'=>nil},'d'=>nil,'f'=>{'g'=>nil}}
我不想删除嵌套的哈希值。嵌套级别从一到六个级别
感谢名单
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}}
变化,您可以编写自定义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}}
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}}
这不会修改散列而是给你清理副本
对于一个表达式'case'是不好的做法。 –
@Monk_Code谢谢,编辑。 –
递归是我认为的唯一选择。 – Candide