转换嵌套的Clojure映射

3
我在转换一个Clojure map时遇到了问题。该map的元素是一个向量,而向量中的元素又是map。
原始map如下所示:
{"values" [{"sub" false, "name" "Adhoc"} {"acm" true, "list" true, "deval" true, "name" "Buyer"}]}
向量中的map始终具有键"name",但其他键可能会有所不同。名称元素应在map中充当键。
最终,我需要将原始map转换为以下内容:
{"values" {"Adhoc" {"sub" false}, "Buyer" {"deval" true, "acm" true, "list" true}}}
问题在于向量中的map可以具有任意数量的元素,我不知道如何通过循环解决这个问题。非常感谢您提供任何建议。
1个回答

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

太棒了xsc!非常感谢! - C.A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接