Идиоматический способ перебора карты, "изменение" каждого значения и возвращение карты?
(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
и применяет их к ключам и значениям соответственно.