私の目標は、次のようにハッシュに空白があるかどうかを判断することです。
{"departure_time_slots"=>{"date"=>[""], "time"=>{"start"=>[""], "end"=>[""]}}}
文字列は任意の回数ネストされます。それぞれを手動でチェックしたくありません。文字列の深さに関係なく、すべての文字列を抽出できればいいのにと思います。それを行う簡単な方法はありますか?
私の目標は、次のようにハッシュに空白があるかどうかを判断することです。
{"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
=> ["", "", ""]
あなたがそのようなsthを使うならば、それはより良いでしょう:
departure_time_slots = {:date => Time.new, :time_start => nil, :time_end => nil}
また、ハッシュでキーを使用する場合は、キーにシンボルを使用することをお勧めします。(http://www.ruby-doc.org/core-1.9.3/Symbol.html)
いいえ、できません。それらは互いに異なる範囲で完全に存在しているからです。たとえば。キーstart
であり、上記の例のオブジェクトend
から完全に不明でマスクされています。departure_time_slots
1 つの方法として、hashmap 型の hashmap のすべての値を再度取得し、それらのキーを再帰的に取得する方法があります。
のキーを取得departure_time_slots
し、そのマップの値リストから、すべての値からすべてのキーを見つけます (それがハッシュマップである場合)。それ以外に方法はないと思います。
PS補足として、要素を配列にすることもできる配列に構造を変更できるかどうかを確認し、配列のフラット化の概念を試してみてください。:P