我有一张地图,我想在其中更新值(字符串) 但我只想更新几个键,而不是所有键。
我是新来的,不知道该怎么做。
是否可以只更新Clojure映射中的几个键,而使其余键保持不变?
答案 0 :(得分:3)
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"}}
答案 1 :(得分:2)
以下内容将仅更新键string testString = "12P123";
if(
// check if third number is letter
Char.IsLetter(testString[2]) &&
// if above succeeds, code proceeds to second condition (short-circuiting)
// remove third character, after that it should be a valid number (only digits)
int.TryParse(testString.Remove(2, 1), out int i)
) {...}
和:a
:
:b
答案 2 :(得分:1)
试图总结到目前为止的评论和答案...
有几种方法可以仅更新地图中的某些键。哪一个最好取决于
assoc-in
代替assoc
或update-in
代替update
。update
和update-in
上使用assoc
和assoc-in
。assoc
,assoc-in
,update
和update-in
都在幕后使用了多个键的递归。使用许多键,您可能会遇到堆栈溢出异常。使用->
的符号也是如此,它将代码重写为嵌套调用。into
,请使用merge
或assoc
。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)