map-map
, map-map-keys
, 和map-map-values
我知道 Clojure 中没有为此的现有函数,但这是该函数的一个实现,因为map-map-values
您可以自由复制。它带有两个密切相关的函数map-map
和map-map-keys
,标准库中也缺少这两个函数:
(defn map-map
"Returns a new map with each key-value pair in `m` transformed by `f`. `f` takes the arguments `[key value]` and should return a value castable to a map entry, such as `{transformed-key transformed-value}`."
[f m]
(into (empty m) (map #(apply f %) m)) )
(defn map-map-keys [f m]
(map-map (fn [key value] {(f key) value}) m) )
(defn map-map-values [f m]
(map-map (fn [key value] {key (f value)}) m) )
用法
你可以map-map-values
这样调用:
(map-map-values str {:a 1 :b 2})
;; => {:a "1", :b "2"}
其他两个函数是这样的:
(map-map-keys str {:a 1 :b 2})
;; => {":a" 1, ":b" 2}
(map-map (fn [k v] {v k}) {:a 1 :b 2})
;; => {1 :a, 2 :b}
替代实现
如果您只想要map-map-keys
or map-map-values
,而没有更通用的map-map
功能,您可以使用这些不依赖于的实现map-map
:
(defn map-map-keys [f m]
(into (empty m)
(for [[key value] m]
{(f key) value} )))
(defn map-map-values [f m]
(into (empty m)
(for [[key value] m]
{key (f value)} )))
此外,如果您更喜欢这种措辞,这里还有一个map-map
基于clojure.walk/walk
而不是的替代实现:into
(defn map-map [f m]
(clojure.walk/walk #(apply f %) identity m) )
并行版本 –pmap-map
等。
如果您需要,这些函数也有并行版本。他们只是使用pmap
而不是map
.
(defn pmap-map [f m]
(into (empty m) (pmap #(apply f %) m)) )
(defn pmap-map-keys [f m]
(pmap-map (fn [key value] {(f key) value}) m) )
(defn pmap-map-values [f m]
(pmap-map (fn [key value] {key (f value)}) m) )