2017-09-14 26 views
-1

私はこの配列を持っています[{:foo=>[{:bar=>[:baz]}]}, :foo, {:foo=>[{:bar=>[:bat]}]}, :bar] ご覧のとおり、シンボルとハッシュがあります。私がしようとしているのは、各キーまたは値の中のキーの繰り返しを避けることです。 私の所望の出力は次のようになります。あなたが見ることができるようにハッシュとシンボルの配列をユニークに変換する

[{:foo=>[{:bar=>[:baz, :bat]}]}, :bar] 

は、キーFOOまたはFOO =>バーの繰り返しのない繰り返しはありません。

私は何時間もこんなことをしてきましたが、私はそれを達成できません。何か案が?以下

+0

ハッシュ値による再帰的反復は_almost_ doになります。事は、**解決策がないと述べているように問題です。 '{foo:[:bar]}、{foo:{bar:[:baz]}}'と考えてください。 – mudasobwa

+0

ええ、それはまさに私に起こるものです。私はほとんどそれを得るが、決して最終的な解決策を出すことはありません。 – Ruffeng

+0

配列( "foo.bar.baz、foo、foo.bar.bat、bar")から来ているので、私はこの特定の配列を構築している瞬間です。 – Ruffeng

答えて

0

は何とか動作します:

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] 

私はそれを信じています

+0

Merci mudasobwa。 Hoprovarémes tard!バルセロナのAbraçada – Ruffeng

+0

De nada!/De res! – mudasobwa

関連する問題