映射一个clojure映射



我一直在尝试使用Clojure中的map函数,并且想知道将map应用于map集合的最佳实践是什么,以便:

(map #(pprint (str %1 " " %2)) {:hello 1 :world 2})

输出(顺序现在不重要了):

:hello 1
:world 2

我第一个想法是:

(def my-map {:hello 1 :world 2})
(map #(pprint (str %1 " " %2)) (keys my-map) (vals my-map))

但是!我在文档中没有发现任何证据表明Clojure(或ClojureScript)保证keysvals序列的顺序是相互保留的。

(map #(pprint (str (first %1) " " (rest %1))) my-map)

这不是那么好,因为它将与普通%1%2

我相信有更好的方法来做这件事。如果你知道,请分享一下好吗?提前感谢!

keysvals给出相同的顺序。

或者,您可以跨映射的条目映射函数:

(map (fn [[k v]] ...) {:foo 1 :bar 2})

或者使用reduce-kv:

(reduce-kv (fn [_ k v] ...) nil {:foo 1 :bar 2})

map用于惰性地在集合上应用函数以生成新集合。当您真正需要结果集合时,我会使用它。

但是在这种情况下,你只是为了pprint的副作用而枚举k/v对,所以考虑使用doseq来代替:

(doseq [[k v] {:hello 1 :world 2}]
  (pprint (str k " " v)))

最新更新