如何以递归方式在ruby哈希中用“”替换所有nil值?

时间:2014-05-28 04:52:36

标签: ruby hash proc

str = "<a><b><c></c></b></a>"
hash = Hash.from_xml(str)
# => {"a"=>{"b"=>{"c"=>nil}}}

如何将哈希中的所有nil替换为"",以便哈希变为:

{"a"=>{"b"=>{"c"=>""}}}

3 个答案:

答案 0 :(得分:13)

这是一个不会改变原始哈希的递归方法。

<强>代码

def denilize(h)
  h.each_with_object({}) { |(k,v),g|
    g[k] = (Hash === v) ?  denilize(v) : v.nil? ? '' : v }
end

<强>实施例

h = { "a"=>{ "b"=>{ "c"=>nil } } }
denilize(h) #=> { "a"=>{ "b"=>{ "c"=>"" } } }

h = { "a"=>{ "b"=>{ "c"=>nil , "d"=>3, "e"=>nil}, "f"=>nil  } }
denilize(h) #=> { "a"=>{ "b"=>{ "c"=>"" , "d"=>3, "e"=>""}, "f"=>"" } } 

答案 1 :(得分:2)

这将破坏原始哈希,并且无法使用具有无限递归的哈希。

def nil2empty(hash)
  hash.keys.each do |key|
    if hash[key].kind_of? Hash
      nil2empty(hash[key])
    else
      hash[key] = '' if hash[key].nil?
    end
  end
  true # of course, what else? :P
end

用法示例:

hash
 => {"a"=>{"b"=>{"c"=>nil}}} 
nil2empty(hash)
 => true 
hash
 => {"a"=>{"b"=>{"c"=>""}}} 

答案 2 :(得分:0)

我知道这不是你期望的答案,但如果你能处理一个值而不是&#34;&#34; ,此代码有效

eval({"a"=>{"b"=>{"c"=>nil}}}.to_s.gsub("nil", "1")) #=> returns a hash #{"a"=>{"b"=>{"c"=>1}}}