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

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

{"departure_time_slots"=>{"date"=>[""], "time"=>{"start"=>[""], "end"=>[""]}}} 

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

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

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

用法:

 h = {"departure_time_slots"=>{"date"=>[""], "time"=>{"start"=>[""], "end"=>[""]}}} h.recursive_values => ["", "", ""] 

如果您将使用这样的话会更好:

departure_time_slots = {:date => Time.new, :time_start => nil, :time_end => nil}

当你在Hash中使用键时,最好使用Symbols作为键。 (http://www.ruby-doc.org/core-1.9.3/Symbol.html)

不可能。 因为它们完全存在于彼此不同的范围内。 例如。 在上面的例子中,keys startend完全是未知的,并且会从departure_time_slots对象中屏蔽掉。

一个圆形邻接方式可以是,再次获得hashmap的所有值,这些值是hashmap类型并且重新获得它们的键。

获取departure_time_slots键,然后从该映射的值列表中查找每个值的所有键,如果它是一个hashmap。 除此之外,我认为还有另一种方式。

PS旁注,看看你是否可以将你的结构修改为一个数组,其中元素也可以是数组,并尝试使用flatten数组的概念。 :P