crenshaw-dev
crenshaw-dev

Reputation: 8412

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

Suppose I have an object like this:

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

How could I change that object to be like this?

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

If yucky-key is not present, I'd like the input to be returned unchanged.

I've looked at the update function which works on values. But I don't see an analogous function for keys.

Upvotes: 1

Views: 270

Answers (2)

gooooof
gooooof

Reputation: 41

If you want to write an implementation manually, you can do this:

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

Upvotes: 1

jas
jas

Reputation: 10865

You can change the key using rename-keys in clojure.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"}

If the key to change is not present, the original map is returned

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

Upvotes: 5

Related Questions