map-map
, map-map-keys
Undmap-map-values
Ich kenne keine existierende Funktion in Clojure dafür, aber hier ist eine Implementierung dieser Funktion, da map-map-values
Sie frei kopieren können. Es kommt mit zwei eng verwandten Funktionen map-map
und map-map-keys
, die auch in der Standardbibliothek fehlen:
(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) )
Verwendung
Sie können so anrufen map-map-values
:
(map-map-values str {:a 1 :b 2})
;; => {:a "1", :b "2"}
Und die anderen beiden Funktionen wie folgt:
(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}
Alternative Implementierungen
Wenn Sie nur map-map-keys
oder map-map-values
ohne die allgemeinere map-map
Funktion möchten , können Sie diese Implementierungen verwenden, die nicht auf Folgendem beruhen 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)} )))
Hier ist auch eine alternative Implementierung map-map
, die auf basiert, clojure.walk/walk
anstatt into
, wenn Sie diese Formulierung bevorzugen:
(defn map-map [f m]
(clojure.walk/walk #(apply f %) identity m) )
Parellel-Versionen - pmap-map
usw.
Es gibt auch parallele Versionen dieser Funktionen, wenn Sie sie benötigen. Sie verwenden einfach pmap
anstelle von 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) )