map-map
, map-map-keys
Vàmap-map-values
Tôi biết không có chức năng hiện có trong Clojure cho việc này, nhưng đây là một triển khai của chức năng map-map-values
đó vì bạn có thể tự do sao chép. Nó đi kèm với hai chức năng liên quan chặt chẽ map-map
và map-map-keys
, cũng bị thiếu trong thư viện tiêu chuẩn:
(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) )
Sử dụng
Bạn có thể gọi map-map-values
như thế này:
(map-map-values str {:a 1 :b 2})
;; => {:a "1", :b "2"}
Và hai chức năng khác như thế này:
(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}
Triển khai thay thế
Nếu bạn chỉ muốn map-map-keys
hoặc map-map-values
, không có map-map
chức năng tổng quát hơn , bạn có thể sử dụng các triển khai này, không dựa vào 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)} )))
Ngoài ra, đây là một triển khai thay thế map-map
dựa trên clojure.walk/walk
thay vì into
, nếu bạn thích cụm từ này:
(defn map-map [f m]
(clojure.walk/walk #(apply f %) identity m) )
Phiên bản Parellel - pmap-map
, v.v.
Ngoài ra còn có các phiên bản song song của các chức năng này nếu bạn cần chúng. Họ chỉ đơn giản là sử dụng pmap
thay vì 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) )