map-map
、map-map-keys
、およびmap-map-values
Clojure にこのための既存の関数がないことは知ってmap-map-values
いますが、自由にコピーできるように、その関数の実装を次に示します。密接に関連する 2 つの関数 と が付属して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"}
他の 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
またはのみが必要な場合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) )