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})
И две другие функции вроде этого:
(map-map-keys str {:a 1 :b 2})
(map-map (fn [k v] {v k}) {:a 1 :b 2})
Альтернативные реализации
Если вы хотите map-map-keys
или 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) )
Версии Parellel - 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) )