1

これをプログラムで変換したい:

{
"a"=>
  {"1"=>
    {"A"=>
      {"Standard"=>"true"}
    }
  },
"b"=>
  {"1"=>
    {"A"=>
      {"Standard"=>"true"}
    }
  }
}

次のような配列に:

['a/1/A/Standard', 'b/1/A/Standard']
4

3 に答える 3

4
def extract_keys(hash)
  return [] unless hash.is_a?(Hash)
  hash.each_pair.map {|key, value| [key, extract_keys(value)].join('/') }
end
extract_keys(hash)
=> ["a/1/A/Standard", "b/1/A/Standard"]
于 2012-09-19T19:08:18.227 に答える
2

私の他の回答の1つから-あなたの状況に適応しました。より詳細な解決策については、リンクを参照してくださいflat_hash

def flat_hash(hash, k = "")
  return {k => hash} unless hash.is_a?(Hash)
  hash.inject({}){ |h, v| h.merge! flat_hash(v[-1], k + '/' + v[0]) }
end

example = {...} # your example hash
foo = flat_hash(example).keys
=> ["/a/1/A/Standard", "/b/1/A/Standard"] 
于 2012-09-19T19:14:28.227 に答える
1

この平坦化されたラムダ定義を 見つけました。

h = {
"a"=>
  {"1"=>
    {"A"=>
      {"Standard"=>"true"}
     }
  },
"b"=>
  {"1"=>
     {"A"=>
       {"Standard"=>"true"}
     }
  }
}

a = []

flatten =
  lambda {|r|
    (recurse = lambda {|v|
      if v.is_a?(Hash)
        v.to_a.map{|v| recurse.call(v)}.flatten
      elsif v.is_a?(Array)
        v.flatten.map{|v| recurse.call(v)}
      else
        v.to_s
      end
    }).call(r)
  }

h.each do |k,v|
  a << k + "/" + flatten.call(v).join("/")
end

出力:

 ["a/1/A/Standard/true", "b/1/A/Standard/true"]
于 2012-09-19T19:17:31.323 に答える