繁体   English   中英

使用带有多个密钥的Clojure更新

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM