![](/img/trans.png)
[英]how to retrieve a key in a map whose value contains a particular substring in clojure?
[英]how to update only a few keys in a map in clojure?
我有一张地图,我想更新值(是字符串),但我只想更新几个键,而不是所有键。
我是新手,不知道该怎么做。
是否可以只更新Clojure映射中的几个键,而保持其余键不变?
如果要将函数应用于值,则update
是执行此操作的有效方法。 否则,您可以将新值关联到地图
(def example {:a "a" :b "b" :c "c"})
(assoc example
:a "foo"
:c "bar")
#=> {:a "foo" :b "b" :c "bar")
或update-in
嵌套数据
(def example {:data {:a "a" :b "b" :c "c"}})
(update-in example [:data] assoc
:a "foo"
:c "bar")
#=> {:data {:a "foo" :b "b" :c "bar"}}
以下将仅更新键:a
和:b
:
(def example {:a 1 :b 2 :c 3})
(-> example
(update :a inc)
(update :b inc))
;; {:a 2, :b 3, :c 3}
试图总结到目前为止的评论和答案...
有几种方法可以仅更新地图中的某些键。 最好的取决于哪一个
assoc-in
代替assoc
或使用update-in
代替update
。 assoc
和assoc-in
update
和update-in
assoc-in
。 assoc
, assoc-in
, update
和update-in
都在幕后使用了多个键的递归。 使用许多键,您可能会遇到堆栈溢出异常。 使用->
的符号也是如此,它将代码重写为嵌套调用。 assoc
,请使用into
或merge
。 into
或merge
也将更加容易。 into
可能比merge
更快,因为它在后台使用了多态reduce
。 update
,请考虑使用reduce
一次遍历地图并收集新值。 这是更底层的,但根据您的情况,可以避免重复两次。 例子
请参阅(并赞扬:-)有关assoc
, assoc-in
, update
和update-in
示例的其他响应。
(def sample-map {:a 1 :b 2 :c 3})
(def new-values {:b 22 :c 33})
(into sample-map new-values)
(merge sample-map new-values)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.