Techioz Blog

RubyによるJSONオブジェクトまたはハッシュのフラット化

概要

// JSON オブジェクトのフラット化 // (すべてのキーをネストされたハッシュの文字列としてマージし、配列リストに出力したい)

input1 = {a: {b: {c: {} }, d:[] }, e: "e", f: nil, g: -2}
input2 = {a: {b: {c: {h: {j: ''}, m: {n: ''}}}, d: {k: {l: '' } }},e: "e",f: nil,g: -2}

// 上記の入力に対して期待される出力は、これらすべてのキーを任意の順序で含む配列である必要があります

output1 = ["g", "f", "e", "a.b.c", "a.d"]
output2 = ["a.b.c.h.j", "a.b.c.m.n", "a.d.k.l", "e", "f", "g"]

解決策

メソッドを 1 つ作成する

def flatten_hash_keys(hash, prefix = nil)
  flat_keys = []

  hash.each do |key, value|
    current_key = prefix ? "#{prefix}.#{key}" : key.to_s

    if value.is_a?(Hash) && !value.empty?
      flat_keys.concat(flatten_hash_keys(value, current_key))
    else
      flat_keys << current_key
    end
  end

  flat_keys
end

このコードは、ハッシュとオプションのプレフィックスを取る flatten_hash_keys メソッドを定義します。ハッシュを再帰的に走査し、キーを flat_keys 配列に追加します。値が空ではないハッシュの場合、メソッドは新しいプレフィックスを使用して再帰的に呼び出されます。それ以外の場合は、現在のキーが配列に追加されます

input1 = {a: {b: {c: {} }, d:[] }, e: "e", f: nil, g: -2}
input2 = {a: {b: {c: {h: {j: ''}, m: {n: ''}}}, d: {k: {l: '' } }},e: "e",f: nil,g: -2}

output1 = flatten_hash_keys(input1) #["a.b.c", "a.d", "e", "f", "g"]
output2 = flatten_hash_keys(input2) #["a.b.c.h.j", "a.b.c.m.n", "a.d.k.l", "e", "f", "g"]