2017-09-04 62 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!就會很重要。

如果你沒有一個載體,但要創建一個在運行,那麼這將工作:

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

但在另一方面,沒有真正需要使用的載體。

'({: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:(vector?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)