String 如何在clojure中只更新地图中的几个键?

String 如何在clojure中只更新地图中的几个键?,string,dictionary,clojure,String,Dictionary,Clojure,我有一个映射,我想在其中更新字符串值 但我只想更新几个键,而不是所有的键 我是新来的,不知道怎么做 是否可以只更新Clojure映射中的几个键,保持其余键不变 以下内容将仅更新键:a和:b: 以下内容将仅更新密钥:a和:b: 如果要对值应用函数,更新是一种有效的方法。否则,您可以将新值关联到映射 (def example {:a "a" :b "b" :c "c"}) (assoc example :a "foo" :c "bar") #=> {:a "foo"

我有一个映射,我想在其中更新字符串值 但我只想更新几个键,而不是所有的键

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


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

以下内容将仅更新键:a和:b:


以下内容将仅更新密钥:a和:b:

如果要对值应用函数,更新是一种有效的方法。否则,您可以将新值关联到映射

(def example {:a "a" :b "b" :c "c"})
(assoc example
       :a "foo"
       :c "bar")
#=> {:a "foo" :b "b" :c "bar")
或在中更新嵌套数据

(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"}}
如果要对值应用函数,更新是一种有效的方法。否则,您可以将新值关联到映射

(def example {:a "a" :b "b" :c "c"})
(assoc example
       :a "foo"
       :c "bar")
#=> {:a "foo" :b "b" :c "bar")
或在中更新嵌套数据

(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"}}

正在尝试总结到目前为止的评论和答案

有几种方法可以仅更新地图中的某些关键点。哪一个是最好的取决于

您的数据结构是嵌套的吗? 如果嵌套,请在中使用assoc而不是assoc,或在中使用update而不是update。 您是否根据旧值计算新值? 如果需要旧值,请在assoc上使用update和update in,在中使用assoc。 你有多少把钥匙?你怎么有? 函数assoc、assoc in、update和update in都在引擎盖下对多个键使用递归。对于许多键,您可能会遇到堆栈溢出异常。使用->的表示法也是如此,它将代码重写为嵌套调用。 在这种情况下,如果不使用assoc,请使用into或merge。 如果您没有一组固定的要更新的键,而是在运行时计算的键,那么使用into或merge也会更容易。 请注意,into可能比merge更快,因为它在引擎盖下使用了多态reduce。 如果根据旧的值计算新值,即使用更新,则考虑使用Read一次遍历地图并收集新值。这是更低级的,但可能会避免重复两次,具体取决于您的场景。 例子

请参阅和upvote:-有关assoc、assoc in、update和update in示例的其他回复


正在尝试总结到目前为止的评论和答案

有几种方法可以仅更新地图中的某些关键点。哪一个是最好的取决于

您的数据结构是嵌套的吗? 如果嵌套,请在中使用assoc而不是assoc,或在中使用update而不是update。 您是否根据旧值计算新值? 如果需要旧值,请在assoc上使用update和update in,在中使用assoc。 你有多少把钥匙?你怎么有? 函数assoc、assoc in、update和update in都在引擎盖下对多个键使用递归。对于许多键,您可能会遇到堆栈溢出异常。使用->的表示法也是如此,它将代码重写为嵌套调用。 在这种情况下,如果不使用assoc,请使用into或merge。 如果您没有一组固定的要更新的键,而是在运行时计算的键,那么使用into或merge也会更容易。 请注意,into可能比merge更快,因为它在引擎盖下使用了多态reduce。 如果根据旧的值计算新值,即使用更新,则考虑使用Read一次遍历地图并收集新值。这是更低级的,但可能会避免重复两次,具体取决于您的场景。 例子

请参阅和upvote:-有关assoc、assoc in、update和update in示例的其他回复


您希望如何更新密钥?对它们应用函数或用新值替换它们?用新值替换它们如何更新键?对它们应用一个函数或用新值替换它们?用新值替换它们这两个加上合并到一起。@StefanKamphausen true这两个加上合并到一起。@StefanKamphausen true