将序列图转换为矢量图

时间:2014-11-29 18:33:12

标签: clojure

我在clojure中有以下地图:

{:filter [(:filter "f1\n") (:filter "f2\n")], :mangle [(:mangle "m1\n")]}

但是为了进一步处理,我需要......像:

{:filter ["f1\n" "f2\n"], :mangle ["m1\n"]}

我该如何进行转换?

2 个答案:

答案 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)

对于像这样的问题,有一个可以映射地图中的值的实用程序功能很有用:

  • Clojure Cookbook 定义了第100页的map-values
  • Clojure Programming 定义了第88页的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"]}