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})
;; => {:a "1", :b "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) )
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) )