如何在clojure中将地图的值转换为矢量

时间:2015-06-26 13:42:38

标签: clojure

如何将地图的值转换为矢量?例如: {:foo 1 :bar {:foo 1 :bar 2}}{:foo 1 :bar [{:foo 1 :bar 2}]}

尝试

(for [k (vector (keys m)) :let [m (assoc m :k (vector (:k m)) )] :when (isa? (class (:k m)) clojure.lang.PersistentArrayMap) ] (:k m)) m)

但地图显示没有任何转换。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

这个怎么样:

(into {} (for [[k v] m] [k (if (map? v) [v] v)]))

答案 1 :(得分:2)

您可以尝试使用postwalk来支持嵌套地图。

 (use 'clojure.walk)
 (postwalk (fn [x]
             (if (map? x) (vector x) x))
          {:foo 1 :bar {:foo 1 :bar 2}})

答案 2 :(得分:2)

zero323的解决方案可能比我的解决方案效率更高,但由于知道多个解决方案并不会有什么坏处,除了目前发布的解决方案之外,还有另一个解决方案:

(zipmap (keys m) 
        (map #(if (map? %) (vector %) %) 
              (vals m)))