当且仅当该密钥存在时,我如何更新 Clojure 中的密钥?

How can I update a key in Clojure if and only if that key is present?

假设我有这样一个对象:

{
  "yucky-key": "value",
  "another-key": "value"
}

我怎样才能把那个对象改成这样?

{
  "better-key": "value",
  "another-key": "value"
}

如果 yucky-key 不存在,我希望原样返回输入。

我看过 update 作用于值的函数。但是我没有看到按键的类似功能。

您可以使用 rename-keysclojure.set

中更改密钥
user> (def m {"yucky-key" "value",  "another-key" "value"})
#'user/m

user> (clojure.set/rename-keys m {"yucky-key" "better-key"})
{"another-key" "value", "better-key" "value"}

如果要更改的键不存在,则返回原始地图

user> (def m2 {"okay-key" "value",  "another-key" "value"})
#'user/m2

user> (clojure.set/rename-keys m2 {"yucky-key" "better-key"})
{"okay-key" "value", "another-key" "value"}

如果您想手动编写实现,可以这样做:

(def m1 {"yucky-key" "value1"
         "another-key" "value2"})
(def m2 {"good-key" "value1"
         "another-key" "value2"})

(defn replace-key-in-map
  [m original-key targeted-key]
  (into {}
        (map (fn [[k v]]
               (if (= k original-key)
                 {targeted-key v}
                 {k v}))
             m)))

(replace-key-in-map m1 "yucky-key" "better-key")
(replace-key-in-map m2 "yucky-key" "better-key")