从任意深度哈希中优雅地提取所有字符串

jie*_*eng 0 ruby hash ruby-on-rails

我的目标是确定散列中是否有空白,如下所示:

{"departure_time_slots"=>{"date"=>[""], "time"=>{"start"=>[""], "end"=>[""]}}}
Run Code Online (Sandbox Code Playgroud)

字符串是嵌套的任意时间.我不想手动检查每一个.如果我可以提取所有字符串而不管它们的深度如何,那将是很好的.有一个简单的方法吗?

Cas*_*per 5

这是一个如何提取值的示例.但是,您仍然会遇到将值与键匹配的问题.你不可能同时拥有两者.

# Extend the Hash class
class Hash
  def recursive_values
    self.values.collect { |v|
      v.is_a?(Hash) ? v.recursive_values : v
    }.flatten
  end
end
Run Code Online (Sandbox Code Playgroud)

用法:

h = {"departure_time_slots"=>{"date"=>[""], "time"=>{"start"=>[""], "end"=>[""]}}}
h.recursive_values
=> ["", "", ""]
Run Code Online (Sandbox Code Playgroud)