簡體   English   中英

轉換嵌套Clojure映射

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM