Reputation: 8412
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
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
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