Vector 变换嵌套clojure映射

Vector 变换嵌套clojure映射,vector,clojure,maps,Vector,Clojure,Maps,我在转换clojure地图时遇到问题。地图有一个向量作为元素,而向量又有地图作为元素 原始地图如下所示: {"values" [{"sub" false, "name" "Adhoc"} {"acm" true, "list" true, "deval" true, "name" "Buyer"}]} {“values”[{“sub”false,“name”“Adhoc”}{“acm”true,“list”true,“deval”true,“name”“Buyer”}] 向量中的贴图始终具有键“

我在转换clojure地图时遇到问题。地图有一个向量作为元素,而向量又有地图作为元素

原始地图如下所示:

{"values" [{"sub" false, "name" "Adhoc"} {"acm" true, "list" true, "deval" true, "name" "Buyer"}]} {“values”[{“sub”false,“name”“Adhoc”}{“acm”true,“list”true,“deval”true,“name”“Buyer”}] 向量中的贴图始终具有键“name”,但其他键可能会有所不同。 name元素应该作为映射中的键。 作为最终结果,我需要将原始地图转换为:

{"values" {"Adhoc" {"sub" false}, "Buyer" {"deval" true, "acm" true, "list" true}} {“values”{“Adhoc”{“sub”false},“买方”{“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
中):


如果将键转换为关键字,则可以非常干净地执行此操作:

(->)原始地图
:值
(mapv#%/%[%:name(dissoc%:name)])
(进入{})
(#%/%{:values%}))
{:values{“Adhoc”{:sub-false},“买方”{:acm-true、:list-true、:deval-true}}

xsc真棒!非常感谢!
(update-in my-map ["values"] merge-by "name")