機略戦記

Maneuver warfare

Hashの中から特定のKeyを持ったValueだけを再帰的に取り出したい

  • このような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が帰ってくるのが不満だけど、今回のユースケースには関係なかったので無視した(書捨てのスクリプトだったし…)