6

特定のキーに一致するマップ内のすべての要素に関数を適用しようとしています。

(def mymap {:a "a" :b "b" :c "c"}) 
(update-in mymap [:a :b] #(str "X-" %))

私は期待しています

{:a "X-a", :c "c", :b "X-b"}

しかし、私は得る

ClassCastException java.lang.String は clojure.lang.Associative clojure.lang.RT.assoc にキャストできません (RT.java:702)

誰でもこれで私を助けることができますか?

4

3 に答える 3

10

update-inマップ内の単一のキーを更新することです (特定のネスト レベルでは、[:a :b]キー :a のマップ値内のキー :b を更新することを意味します)。

reduce を使用して、必要なことを行うことができます。

(reduce #(assoc %1 %2 (str "X-" (%1 %2)))
        mymap
        [:a :b])
于 2013-03-27T06:37:44.880 に答える
2

一般化された関数は次のとおりです。

(defn update-each
  "Updates each keyword listed in ks on associative structure m using fn."
  [m ks fn]
  (reduce #(update-in %1 [%2] fn) m ks))

(update-each mymap [:a :b] #(str "X-" %))
于 2015-05-13T13:16:16.170 に答える
0

以下のソリューションでは、haspmap が最初にフィルター処理された場合、str 関数にマップされ、元のハッシュマップとマージされます -

(def m {:a "a" :b "b" :c "c"})
(def keys #{:a :b})

(->> m
    (filter (fn [[k v]] (k keys)))
    (map (fn [[k v]] [k (str "X-" v)]))
    (into {})
    (merge m)) 
于 2013-03-28T13:11:58.590 に答える