【问题标题】:Transforming keys of a map in Clojure在 Clojure 中转换地图的键
【发布时间】:2014-01-31 14:57:09
【问题描述】:

我正在使用代表具有以下 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

有没有更惯用的方法来实现这一点?

【问题讨论】:

    标签: clojure


    【解决方案1】:
    (clojure.set/rename-keys args clj->rest)
    

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

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

    我认为您已经知道如何将其更改为所需的 JSON。

    【讨论】:

    • 太棒了,谢谢!是的,JSON 没问题;我可以使用clojure.data.json/write-str,也可以只使用clj-http 中的{:form-params {...} :content-type :json}
    【解决方案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)
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-14
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-28
        相关资源
        最近更新 更多