Идиоматический способ перебора карты, "изменение" каждого значения и возвращение карты?

(def m {:a 1 :b 2 :c 3})

Допустим, я хочу, чтобы каждое значение в m быть увеличен. Единственный способ сделать это -

(into {}
      (map
        (fn [[key val]]
          [key (inc val)])
        m))

Есть лучший способ сделать это? Мне нужно сделать это много в моем коде, и это выглядит довольно странно. Мне действительно нужно использовать карту здесь (в основном для поиска O(1), ключом будет UUID и значение карты), а не вектор или список.

1 ответ

Нашел что-то, что выглядит хорошо здесь: http://clojuredocs.org/clojure.core/reduce-kv.

(defn update-map [m f] 
  (reduce-kv (fn [m k v] 
    (assoc m k (f v))) {} m))

Тогда вы можете сделать

(update-map {:a 1 :b 2} inc)

получить

 {:a 2 :b 3}

При необходимости вы можете поставить k в f или сделать update-key-values функция, которая принимает две функции f а также g и применяет их к ключам и значениям соответственно.

Другие вопросы по тегам