变换嵌套的clojure贴图

时间:2013-10-30 13:04:59

标签: vector 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}}

问题在于矢量中的地图可以包含任意数量的元素,而我真的不知道如何通过循环来解决这个问题。 任何建议都将受到高度赞赏。

2 个答案:

答案 0 :(得分:3)

这将为您处理地图矢量:

(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")

答案 1 :(得分:0)

如果您将键转换为关键字,则perc可以使您做到这一点很干净:

(->> original-map
  :values
  (mapv #%/%[%:name (dissoc % :name)])
  (into {})
  (#%/%{:values %}))
{:values {"Adhoc" {:sub false}, "Buyer" {:acm true, :list true, :deval true}}}