- このようなHashのなかから、
key
が:target
である要素を再帰的に取得したい。
{a: {b: {c: {d: {e: {target: :f}}}}}, f: [:g, :h, {target: [:i]}], j: {target: nil}}
こうしてみた
- 再帰的に取得したいので再帰的に取得する。
# keyを持ってる要素を再帰的に取得 def recursive_find(element, key) target_elements = [] case element when Hash target_elements << element[key] if element.key?(key) target_elements += element.values.map{ |e| recursive_find(e, key) } when Array target_elements += element.map{ |e| recursive_find(e, key) } end target_elements.flatten end sample = {a: {b: {c: {d: {e: {target: :f}}}}}, f: [:g, :h, {target: [:i]}], j: {target: nil}} p recursive_find(sample, :target) #=> [:f, :i, nil]
#flatten
を使ってるので[:i]
じゃなくて:i
が帰ってくるのが不満だけど、今回のユースケースには関係なかったので無視した(書捨てのスクリプトだったし…)