はのは、以下のようなネストされたマップがあるとしましょう。(一部のみネストされた)Clojure:ネストされたマップのすべての値に関数を適用して更新するにはどうすればよいですか?
(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))
しかし、私はまだ最初のレベルのキーを指定する必要があり、すべてに適用することはできません第1レベルおよび第2レベルのキー値。
であなたが接近していた実装することができます。条件と再帰呼び出しを追加するだけでいいです: '(defn map-kv [f coll](reduce-kv(fn [mkv] if(map?v)(assoc mk(map-kv fv)) (fv))))(空のcoll)coll)) '。しかし、@ alan-thompsonによる解決策は間違いなく簡単です/慣用的です。 – jsonmurphy