map-map,, map-map-keysdanmap-map-values
Saya tahu tidak ada fungsi yang ada di Clojure untuk ini, tapi ini adalah implementasi dari fungsi itu karena map-map-valuesAnda bebas untuk menyalin. Itu datang dengan dua fungsi terkait erat, map-mapdan map-map-keys, yang juga hilang dari perpustakaan standar:
(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) )
Pemakaian
Anda dapat memanggil map-map-valuesseperti ini:
(map-map-values str {:a 1 :b 2})
;; => {:a "1", :b "2"}
Dan dua fungsi lainnya seperti ini:
(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}
Implementasi alternatif
Jika Anda hanya ingin map-map-keysatau map-map-values, tanpa fungsi yang lebih umum map-map, Anda dapat menggunakan implementasi ini, yang tidak bergantung pada 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)} )))
Juga, inilah implementasi alternatif map-mapyang didasarkan pada clojure.walk/walkalih-alih into, jika Anda lebih suka ungkapan ini:
(defn map-map [f m]
(clojure.walk/walk #(apply f %) identity m) )
Versi parellel - pmap-map, dll.
Ada juga versi paralel dari fungsi-fungsi ini jika Anda membutuhkannya. Mereka hanya menggunakan pmapbukan 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) )