は何とか動作します:
puts (built = builder.(input)).inspect
#⇒ {:foo=>{:bar=>{:baz=>{}, :bat=>{}}}, :bar=>{}}
を使用すると、1つのチェーンのラムダに必要たかった正確に何を返すには(方法はありません。
input = [{:foo=>[{:bar=>[:baz]}]},
:foo,
{:foo=>[{:bar=>[:bat]}]},
:bar]
builder = ->(value, acc = {}) {
case value
when Hash
value.each_with_object(acc) do |(k, v), acc|
builder.(v, acc[k] ||= {})
end
when Array
value.each_with_object(acc) do |v, acc|
builder.(v, acc)
end
else acc[value] ||= {}
end
}
は、上記に既に多かれ少なかれ許容できる結果を生成しますオブジェクトが葉であるかどうかを事前に教えてください)。
fixer = ->(acc) {
result = acc.all? { |*v| v.last.empty? } ? acc.keys :
acc.map { |k, v| v.empty? ? k : { k => fixer.(v) } }
result.size == 1 ? result.first : result
}
puts fixer.(built).inspect
#⇒ [{:foo=>{:bar=>[:baz, :bat]}}, :bar]
私はそれを信じています
ハッシュ値による再帰的反復は_almost_ doになります。事は、**解決策がないと述べているように問題です。 '{foo:[:bar]}、{foo:{bar:[:baz]}}'と考えてください。 – mudasobwa
ええ、それはまさに私に起こるものです。私はほとんどそれを得るが、決して最終的な解決策を出すことはありません。 – Ruffeng
配列( "foo.bar.baz、foo、foo.bar.bat、bar")から来ているので、私はこの特定の配列を構築している瞬間です。 – Ruffeng