Clojure-将平面映射转换为具有预定义结构的嵌套
我是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
{
: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)))
谢谢,没有想到选择键。这样做是有道理的