在Clojure中转换地图的键



我正在使用一个REST API,该API代表以下JSON的帐户:

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

是否有一种更惯用的方法可以实现这一目标?

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

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

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

我认为您已经完成了如何将其更改为所需的JSON。

您可以编写一个简单的助手功能来映射具有给定映射功能的所有键

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

所以,现在您可以轻松地映射您的参数:

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

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

自Clojure 1.11以来,您可以将update-keys函数用于键转换,例如:

(update-keys {"Content-Type" "text/plain"} str/lower-case)
=> {"content-type" "text/plain"}

最新更新