【发布时间】:2017-02-15 14:49:43
【问题描述】:
假设有一个嵌套地图,如下所示:(仅部分嵌套)
(def mymap {:a 10
:b {:ba 21, :bb 22 :bc 23}
:c 30
:d {:da 41, :db 42}})
我如何应用一个函数,比如#(* % 2),并更新此映射中的每个值?那是没有指定任何键。结果将如下所示:
{:a 20,
:b {:ba 42, :bb 44, :bc 46},
:c 60,
:d {:da 82, :db 84}}
到目前为止,我想出了这个自己的功能:
(defn map-kv [f coll] (reduce-kv (fn [m k v] (assoc m k (f v))) (empty coll) coll))
但我还是需要指定一级键,不能应用到所有一级和二级键值。
【问题讨论】:
-
你很亲密。只需添加条件和递归调用:
(defn map-kv [f coll] (reduce-kv (fn [m k v] (if (map? v) (assoc m k (map-kv f v)) (assoc m k (f v)))) (empty coll) coll))。但是@alan-thompson 的解决方案绝对更简单/惯用。
标签: dictionary clojure nested