Search code examples
clojure

Clojure: Convert hash-maps key strings to keywords?


I'm pulling data from Redis using Aleph:

(apply hash-map @(@r [:hgetall (key-medication id)]))

The problem is this data comes back with strings for keys, for ex:

({"name" "Tylenol", "how" "instructions"})

When I need it to be:

({:name "Tylenol", :how "instructions})

I was previously creating a new map via:

{ :name (m "name"), :how (m "how")}

But this is inefficient for a large amount of keys.

If there a function that does this? Or do I have to loop through each?


Solution

  • There is a handy function called keyword that converts Strings into the appropriate keywords:

    (keyword "foo")
    => :foo
    

    So it's just a case of transforming all the keys in your map using this function.

    I'd probably use a list comprehension with destructuring to do this, something like:

    (into {} 
      (for [[k v] my-map] 
        [(keyword k) v]))