2011-06-28 3 views
4

I私はREPLで作成した構造、ネストされた連想構造に追加は

{1 {10 {:id 101, :name "Paul"}, 
    20 {}}, 
2 {30 {}, 40 {}}, 
3 {50 {}, 60 {}}} 

が、私はキー1に新しいKVを追加する必要があり、得られた構造はこのようになりますように、

{1 {10 {:id 101, :name "1x2"}, 20 {}, 11 {:id 102, :name "Ringo"}}, 
2 {30 {}, 40 {}}, 3 {50 {}, 60 {}}}. 

これらのようなネストされた構造を使用するためのget-in update-inおよびassoc-inが見つかりましたが、要素内に新しい要素を追加する方法を見つけることはできません。私のアプリでは、これはすべてrefでラップされ、dosync/alterで更新されましたが、今のところ、私はREPLでこれを行うことができます。

多分これを見過ごしているかもしれませんが、assocまたはassoc-inを使用しようとすると、すでにそこにあるものが変更され、新しい要素が追加されません。

答えて

7

あなたはこのようなキー1と、ネストされたマップに要素を追加するために連想インを使用することができ、あなたの入力

(def input 
    {1 {10 {:id 101 :name "Paul"} 
     20 {}} 
    2 {30 {} 40 {}} 
    3 {50 {} 60 {}}}) 

を考える:

(assoc-in input [1 11] {:id 102 :name "Ringo"}) 

{1 {10 {:id 101 :name "Paul"} 
    11 {:id 102 :name "Ringo"} 
    20 {}} 
2 {30 {} 40 {}} 
3 {50 {} 60 {}}} 

を得ましたAssoc-inは、構造物の最も深いレベルにいたるまで指摘する必要はありません。

あなたが2つの呼び出しを使用している場合は連想であなたは、名前「ポール」を変更するために第2のいずれかを使用することができ、あなたの例のように「1×2」へ:

(assoc-in 
    (assoc-in input [1 11] {:id 102 :name "Ringo"}) 
    [1 10 :name] "1x2")) 

{1 {10 {:id 101 :name "1x2"} 
    11 {:id 102 :name "Ringo"} 
    20 {}} 
2 {30 {} 40 {}} 
3 {50 {} 60 {}}} 
+1

多くのおかげです。私が得たのはassoc-in map [1 11] {}でした。私は、ベクトルがツリーの既存のノードを指さなければならないと考えました。これは大きな助けとなります。非常に興味深い一日。 – JPT

+0

私はそれが有用だったことをうれしく思っています。 – Gert

1
を返します。

既存のノードを指し示す必要がある場合は、これを実行する価値があります。

(update-in input [1] assoc 11 
    {:id 102 :name "Ringo"}) 
関連する問題