我在clojure中有以下地图:
{:filter [(:filter "f1\n") (:filter "f2\n")], :mangle [(:mangle "m1\n")]}
但是为了进一步处理,我需要......像:
{:filter ["f1\n" "f2\n"], :mangle ["m1\n"]}
我该如何进行转换?
答案 0 :(得分:1)
这应该可以解决问题。
(def x '{:filter [(:filter "f1\n") (:filter "f2\n")], :mangle [(:mangle "m1\n")]})
(reduce-kv #(assoc %1 %2 (mapv second %3)) {} x)
;= {:mangle ["m1\n"], :filter ["f1\n" "f2\n"]}
虽然您似乎只需向每个向量添加"string"
而不是添加整个列表(:key "string")
,就可以避免需要此处理步骤。当然,如果您还拥有生成地图的功能。
答案 1 :(得分:1)
对于像这样的问题,有一个可以映射地图中的值的实用程序功能很有用:
map-values
。map-map
,它保留了地图类型。以下内容
(defn map-map [f m] (into (empty m) (for [[k v] m] [k (f v)])))
并给出你的地图
(def m '{:filter [(:filter "f1\n") (:filter "f2\n")], :mangle [(:mangle "m1\n")]})
问题归结为将second
函数映射到地图中每个值的元素中:
(map-map #(mapv second %) m)
;=> {:filter ["f1\n" "f2\n"], :mangle ["m1\n"]}