在Clojure中转换地图的键

时间:2014-01-31 14:57:10

标签: clojure

我正在使用代表具有以下JSON的帐户的REST API:

{ "userName": "foo", "password": "bar", "emailId": "baz" }

我有一个Clojure函数来创建一个可以这样调用的帐户:

(create-account :username "foo" :password "bar" :email "baz")

我想要做的是将create-account带来的漂亮密钥映射到REST API期望的时髦密钥。我目前的解决方案是:

(def clj->rest {:username :userName
                :email :emailId})

(apply hash-map
       (flatten (map
                 (fn [[k v]] [(or (clj->rest k) k) v])
                 args)))  ;; args is the arguments to create-account, as above

有没有更惯用的方法来实现这个目标?

3 个答案:

答案 0 :(得分:9)

(clojure.set/rename-keys args clj->rest)

...模仿你的解决方案,产生......

{:emailId "baz", :userName "foo", :password "bar"}

我认为你已经找到了如何将其更改为所需的JSON。

答案 1 :(得分:2)

您可以编写一个简单的辅助函数来映射具有给定映射函数的所有键:

(defn kmap [f m]
  (into {} (map #(update-in % [0] f) m)))

所以,现在你将能够轻松地映射你的论点:

(def clj->rest {:username :userName
                :password :password
                :email :emailId})

(kmap clj->rest args)

答案 2 :(得分:1)

看起来不错,只需将(apply hash-map (flatten ...更改为(into {} ...即可获得更多惯用代码。