2017-09-04 13 views
1

マップ内のベクトル内にマップがあります。マップ内のベクトル内のネストされたマップの更新

{ :label "Apparel & Accessories", 
    :img_class "itm_3", 
    :children [ 
      {:id "sub1", 
       :label "Clothing", 
       :markup [:div] 
      } 
      {:id "sub2", 
       :label "Shoes & Footwear", 
       :markup [:div] 
      } 
    ] 
} ` 

私がしたいのは、すべてのエントリーからのマークアップです。私はこれと2時間苦労してきました。私が得たのは、子供たちの鍵を逸らすことだけでした。 しかし、マークアップキーのみを削除する必要があります。

最終的な出力は、任意の貢献が高く評価される

{ :label "Apparel & Accessories", 
    :img_class "itm_3", 
    :children [ 
      {:id "sub1", 
       :label "Clothing", 
      } 
      {:id "sub2", 
       :label "Shoes & Footwear", 
      } 
    ] 
} ` 

であるべきです。

+1

あなたは何をしたいんスペクターを、検討する必要がありますhttps://github.com/nathanmarz/specter#specter- – bfontaine

答えて

0

あなたの最初のマップがmある場合は、可能な解決策は、この

(assoc m :children (mapv #(dissoc % :markup) (m :children))) 

であることは:childrenの値をとり、:markupキーを削除し、初期マップに結果を置き換えます。

+0

「ClassCastException clojure.lang.LazySeqはclojure.lang.IFnにキャストできません」 – shan

2

は一度にすべての「変更を作るために良い習慣である:ここでは

(update m :children (fn [v] (assert (vector? v)) (mapv #(dissoc % :markup) v))) 

m一度だけ言及されています。たとえば、swap!を実行していた場合は問題になります。

あなたはベクトルを持って、まだその場で1を作成しない場合、これは動作します:

(update m :children (fn [xs] 
         (->> xs 
          vec 
          (mapv #(dissoc % :markup))))) 

しかし、その一方でベクターを使用してすべき本当の必要はありません。私は2つのステップではなく、残念ながら1でそれを解決し

'({:id "sub1", 
    :label "Clothing", 
    :markup [:div]} 
{:id  "sub2", 
    :label "Shoes & Footwear", 
    :markup [:div]}) 
+0

私のマップは遅延だと思います。あなたの解決策では、 "ClassCastException clojure.lang.LazySeqはclojure.lang.Associativeにキャストできません"というエラーが表示されます – shan

+0

AssertionError Assert failed:(ベクトル?v) – shan

+0

あなたのデータはあなたの質問とは異なります。 'into [] 'を使ってデータを変更することができます。しかし、私はアサートを取り出して、それをローカルで動作させるでしょう... –

1

:childrenに設定されている場合assertなしのオリジナルソリューションが正常に動作します。

(def m { :label "Apparel & Accessories", :img_class "itm_3", :children [ {:id "sub1", :label "Clothing", :markup [:div] } {:id "sub2", :label "Shoes & Footwear", :markup [:div] } ] }) 

(defn dissoc-markup [child] 
    (dissoc child :markup)) 

(update m :children #(mapv dissoc-markup %)) 
1

あなたが削除することを確信している場合は、次のマークアップをあなたがそれを見るたびに、ここでそれを行うための簡単な方法は次のとおりです。

(def your-data {:your-data "...."}) 
(clojure.walk/postwalk (fn [m] 
         (if (map? m) 
          (dissoc m :markup) 
          m)) 
         your-data) 
関連する問題