如何只更新Clojure地图中的几个键?

时间:2018-09-10 09:24:03

标签: string dictionary clojure

我有一张地图,我想在其中更新值(字符串) 但我只想更新几个键,而不是所有键。

我是新来的,不知道该怎么做。

是否可以只更新Clojure映射中的几个键,而使其余键保持不变?

3 个答案:

答案 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代替assocupdate-in代替update
  • 您是否基于旧值计算新值?
    • 如果需要旧值,请在updateupdate-in上使用assocassoc-in
  • 您拥有多少把钥匙,以及如何拥有它们?
    • 函数assocassoc-inupdateupdate-in都在幕后使用了多个键的递归。使用许多键,您可能会遇到堆栈溢出异常。使用->的符号也是如此,它将代码重写为嵌套调用。
    • 在这种情况下,如果不使用into,请使用mergeassoc
    • 如果您没有一组固定的要更新的键,而是要在运行时计算出一些内容,那么使用intomerge也会更容易。
    • 请注意,into可能比merge更快,因为它在引擎盖下使用了多态reduce
    • 如果您要基于旧值计算新值,即将使用update,请考虑使用reduce遍历地图一次并收集新值。这是更底层的,但根据您的情况,可以避免重复两次。

示例

例如,请查看(并赞扬:-)其他答复,其中包含assocassoc-inupdateupdate-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)