Vector 变换嵌套clojure映射
我在转换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} 问题是向量中的映射可以有任意数量的元素,我真的不知道如何用循环来解决这个问题。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”}] 向量中的贴图始终具有键“
如有任何建议,将不胜感激。这将为您处理地图矢量:
(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")