Clojure 序列映射到向量映射的转换
我在clojure有以下地图:Clojure 序列映射到向量映射的转换,clojure,Clojure,我在clojure有以下地图: {:filter [(:filter "f1\n") (:filter "f2\n")], :mangle [(:mangle "m1\n")]} 但为了进一步处理,我需要一些东西,比如: {:filter ["f1\n" "f2\n"], :mangle ["m1\n"]} 如何进行转换?这应该可以实现 (def x '{:filter [(:filter "f1\n") (:filter "f2\n")], :mangle [(:mangle "m1\n"
{:filter [(:filter "f1\n") (:filter "f2\n")], :mangle [(:mangle "m1\n")]}
但为了进一步处理,我需要一些东西,比如:
{:filter ["f1\n" "f2\n"], :mangle ["m1\n"]}
如何进行转换?这应该可以实现
(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”)
来避免此处理步骤的需要。当然,也就是说,如果您还拥有生成映射的函数。对于类似的问题,有一个实用函数可以跨映射中的值进行映射是很有用的:
- Clojure Cookbook在第100页定义了映射值
- Clojure编程在第88页定义了一个
,它保留了映射类型映射
(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"]}
酷-工程-现在我有一个查找和了解的工作:-)许多比。。。关于你的建议:数据生成函数不是我的,所以不幸的是,我对输入数据结构没有影响。