迭代地图,“更改”每个值并返回地图的惯用法?

时间:2015-03-15 01:59:59

标签: dictionary clojure idiomatic

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

我想说我希望m中的每个值都递增。我能想到的唯一方法是

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

有更好的方法吗?我需要在我的代码中做很多事情,它看起来有点hacky。我确实需要在这里使用地图(主要用于O(1)查找,键是UUID,值是地图),而不是矢量或列表。

1 个答案:

答案 0 :(得分:2)

在这里找到了一些看起来不错的东西: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函数,该函数包含两个函数fg并将其应用于键和值分别。