2012-12-29 21 views
0

我的目標是提取所有的字符串,以確定是否有這樣的哈希空白:從典雅的任意深的哈希

​​

中的字符串嵌套的任意時間。我不想手動檢查它們中的每一個。如果我能夠提取所有的字符串,無論它們的深度如何,都會很好。有沒有簡單的方法來做到這一點?

回答

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 

用法:

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

我不在乎對應的鍵是什麼。這正是我想要的。謝謝! :) – jiehanzheng

+0

map + flatten(1)= flat_map。如果你想更精確地描述類型,你會寫'[v]' – tokland

0

沒有不可能的。因爲它們完全相互在不同的範圍內存在。 對於e.g ..鍵startend是完全未知的,並從在上面的例子中departure_time_slots對象遮罩。

一輪緊靠方式可能是,越來越HashMap的再次是類型的HashMap中的所有值和recusively獲得鑰匙。

獲取departure_time_slots的密鑰,然後從該映射的值列表中查找每個值的所有密鑰(如果這是哈希映射)。除此之外,我認爲沒有其他辦法。

P.S.在旁邊注意,看看你是否可以修改你的結構爲一個數組,其中的元素也可以是數組,並嘗試使用數組的平面概念。 :P

0

這將是更好,如果你將使用某事像那:

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

而當你在使用哈希鍵是很好的做法,用符號鑰匙。 (http://www.ruby-doc.org/core-1.9.3/Symbol.html)

+0

他給只有在這種情況下,一個例子。我認爲它可以是任何他試圖壓平的hashmap。 – LPD