[英]Using Clojure update-in with multiple keys
我正在尝试将函数应用于映射中与某个键匹配的所有元素。
(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)
有人可以帮我这个吗?
update-in
是更新地图中的单个键(在特定的嵌套级别, [:a :b]
表示更新键:b在键的映射值内:a。
你想要什么可以使用reduce完成:
(reduce #(assoc %1 %2 (str "X-" (%1 %2)))
mymap
[:a :b])
这是一个通用函数:
(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-" %))
在下面的解决方案中,如果首先过滤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))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.