我的目標是提取所有的字符串,以確定是否有這樣的哈希空白:從典雅的任意深的哈希
中的字符串嵌套的任意時間。我不想手動檢查它們中的每一個。如果我能夠提取所有的字符串,無論它們的深度如何,都會很好。有沒有簡單的方法來做到這一點?
我的目標是提取所有的字符串,以確定是否有這樣的哈希空白:從典雅的任意深的哈希
中的字符串嵌套的任意時間。我不想手動檢查它們中的每一個。如果我能夠提取所有的字符串,無論它們的深度如何,都會很好。有沒有簡單的方法來做到這一點?
這裏是你如何提取值的例子。但是,您仍然會遇到將值與鍵匹配的問題。你不可能同時擁有兩個。
# 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
=> ["", "", ""]
沒有不可能的。因爲它們完全相互在不同的範圍內存在。 對於e.g ..鍵start
和end
是完全未知的,並從在上面的例子中departure_time_slots
對象遮罩。
一輪緊靠方式可能是,越來越HashMap的再次是類型的HashMap中的所有值和recusively獲得鑰匙。
獲取departure_time_slots
的密鑰,然後從該映射的值列表中查找每個值的所有密鑰(如果這是哈希映射)。除此之外,我認爲沒有其他辦法。
P.S.在旁邊注意,看看你是否可以修改你的結構爲一個數組,其中的元素也可以是數組,並嘗試使用數組的平面概念。 :P
這將是更好,如果你將使用某事像那:
departure_time_slots = {:date => Time.new, :time_start => nil, :time_end => nil}
而當你在使用哈希鍵是很好的做法,用符號鑰匙。 (http://www.ruby-doc.org/core-1.9.3/Symbol.html)
他給只有在這種情況下,一個例子。我認爲它可以是任何他試圖壓平的hashmap。 – LPD
我不在乎對應的鍵是什麼。這正是我想要的。謝謝! :) – jiehanzheng
map + flatten(1)= flat_map。如果你想更精確地描述類型,你會寫'[v]' – tokland