Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure-将平面映射转换为具有预定义结构的嵌套_Clojure_Hashmap_Transformation - Fatal编程技术网

Clojure-将平面映射转换为具有预定义结构的嵌套

Clojure-将平面映射转换为具有预定义结构的嵌套,clojure,hashmap,transformation,Clojure,Hashmap,Transformation,我是clojure的新手,我正在尝试将一种特定格式的消息转换成另一种格式 例如,我必须转换如下内容: { :image-url ["https://image.png"], :topic "Some title", :id "88ebaf91-a01d-4683-9aa7-629bb3ecea01", :short-des

我是clojure的新手,我正在尝试将一种特定格式的消息转换成另一种格式

例如,我必须转换如下内容:

   {
     :image-url         ["https://image.png"],
     :topic             "Some title",
     :id                "88ebaf91-a01d-4683-9aa7-629bb3ecea01",
     :short-description "Some Description",
     :mobile-deeplink   "https://deeplink.com/link",
     :partner-name      "partner"}
  
变成

{
 :title   "Some title",
 :id      "88ebaf91-a01d-4683-9aa7-629bb3ecea01",
 :content {
           :url         ["https://image.png"],
           :description "Some Description",
           :deeplink    "https://deeplink.com/link",
           :partner     "partner"}}
因此,实际上,存在重命名关键点和嵌套平面贴图的组合

到目前为止,我所做的是:

(let [message-map {
                   :image-url         :purl
                   :topic             :title
                   :partner-name      :partner
                   :short-description :description
                   :mobile-deeplink   :deeplink}]
  (defn- map-to-body
    [message]
    (-> message
        (clojure.set/rename-keys message-map)
        ;;some sort of (assoc-in) <- this is where i need help in
    )))
你可以在这里把助理锁起来,但我觉得你比较容易 使用选择键。“选择关键点”用于仅提取关键点 从地图到新地图,您需要。因此,您可以为其选择:id/:title 将外部映射和其余映射关联到:content

例如

需要“clojure.set” defn变换 [留言] let[消息映射{:图像url:url] :主题:标题 :合作伙伴名称:合作伙伴 :简短描述:描述 :mobile deeplink:deeplink} 重命名的clojure.set/rename-keys消息映射] 协会;XXX 选择重命名的关键点[:标题:id] :内容选择键重命名[:url:说明:deeplink:合作伙伴] def src{:图像url[https://image.png], :主题:某个标题, :id 88ebaf91-a01d-4683-9aa7-629bb3ecea01, :简短描述一些描述, :移动深度链接https://deeplink.com/link, :合作伙伴名称合作伙伴} def tgt{:title一些title, :id 88ebaf91-a01d-4683-9aa7-629bb3ecea01, :内容{ :url[https://image.png], :描述一些描述, :deeplinkhttps://deeplink.com/link, :合作伙伴} assert=transformsrc-tgt 将assoc in、路径转换表和reduce结合起来,可以更自我描述和维护。您可以选择对转换表或输入消息进行缩减,以对您拥有的数据更有意义的为准

(defn transform [m]
  (let [pp '([:image-url [:content :url]]
             [:topic [:title]]
             [:id [:id]]
             [:short-description [:content :description]]
             ;; etc.
             )]
    (reduce
     (fn [o [mk ok]]
       (assoc-in o ok (get m mk)))
     {}
     pp)))
谢谢,没有想到选择键。这样做是有道理的