Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 序列映射到向量映射的转换_Clojure - Fatal编程技术网

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"

我在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")]})

(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"]}

酷-工程-现在我有一个查找和了解的工作:-)许多比。。。关于你的建议:数据生成函数不是我的,所以不幸的是,我对输入数据结构没有影响。