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]意味着在键的映射值中更新键:b:a。

你想要的可以使用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函数,然后与原始hashmap合并——

(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 回答