[英]Transform nested clojure maps
我在轉換Clojure地圖時遇到麻煩。 地圖以向量為元素,向量又以地圖為元素。
原始地圖如下所示:
{"values" [{"sub" false, "name" "Adhoc"} {"acm" true, "list" true, "deval" true, "name" "Buyer"}]}
向量內的映射始終具有鍵“名稱”,但其他鍵可能會有所不同。 name元素應充當地圖中的鍵。 作為最終結果,我需要將原始地圖轉換為以下內容:
{"values" {"Adhoc" {"sub" false}, "Buyer" {"deval" true, "acm" true, "list" true}}
問題在於向量中的映射可以包含任意數量的元素,而我真的不知道如何通過循環來解決。 任何建議將不勝感激。
這將為您處理地圖矢量:
(defn merge-by
[maps k]
(->> maps
(map (juxt #(get % k) #(dissoc % k)))
(into {})))
(merge-by [{"sub" false, "name" "Adhoc"}
{"acm" true, "list" true, "deval" true, "name" "Buyer"}]
"name")
;; => {"Adhoc" {"sub" false}, "Buyer" {"deval" true, "acm" true, "list" true}}
這將處理外部地圖(如果存儲在my-map
):
(update-in my-map ["values"] merge-by "name")
如果您將鍵轉換為關鍵字,那么perc
可以讓您很干凈地執行此操作:
(->> original-map
:values
(mapv #%/%[%:name (dissoc % :name)])
(into {})
(#%/%{:values %}))
{:values {"Adhoc" {:sub false}, "Buyer" {:acm true, :list true, :deval true}}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.