【问题标题】:Clojure how to mix/merge two mapsClojure如何混合/合并两个地图
【发布时间】:2023-03-16 22:35:01
【问题描述】:

我是 clojure 的新手,我需要混合一个非常复杂的(对我而言)包含 Vector 内部的映射。

原图:

{:cars   {:previous-page nil, :next-page 2, :count 33, :items [{:id 1, :name "test1"}, {:id 2, :name "test2"}]},
 :trucks {:previous-page nil, :next-page 2, :count 11, :items [{:id 1, :name "test3"}, {:id 2, :name "test4"}]},
 :boats  {:previous-page nil, :next-page 2, :count 22, :items [{:id 1, :name "test5"}, {:id 2, :name "test6"}]}}

第二张地图:

 {:cars   {:previous-page 2, :next-page 3, :count 33, :items [{:id 3, :name "test7"}, {:id 4, :name "test8"}]},
  :trucks {:previous-page 3, :next-page 4, :count 11, :items [{:id 3, :name "test9"}, {:id 4, :name "test10"}]},
  :boats  {:previous-page 4, :next-page 5, :count 22, :items [{:id 3, :name "test11"}, {:id 4, :name "test12"}]}}

我只需要将这两张地图混合在一张中:

{:cars   {:previous-page 2, :next-page 3, :count 33, :items [{:id 1, :name "test1"}, {:id 2, :name "test2"},{:id 3, :name "test7"}, {:id 4, :name "test8"}]},
 :trucks {:previous-page 3, :next-page 4, :count 11, :items [{:id 1, :name "test3"}, {:id 2, :name "test4"},{:id 3, :name "test9"}, {:id 4, :name "test10"}]},
 :boats  {:previous-page 4, :next-page 5, :count 22, :items [{:id 1, :name "test5"}, {:id 2, :name "test6"},{:id 3, :name "test11"}, {:id 4, :name "test12"}]}} 

【问题讨论】:

  • 合并它们的规则是什么?您是否需要一个规则,因为您将定期解决这个问题,或者您可以只修复您的数据?
  • 根据结果我会推断出这样的事情:(merge-with (partial merge-with #(if (coll? %1) (into %1 %2) %2)) map1 map2)
  • @jmargolisvt 我需要替换分页值(上一页和下一页),并且在订单中我必须合并项目项目:[{1},{2},{3}, {4}]

标签: clojure hashmap


【解决方案1】:

您可以使用merge-with 将地图与任意函数结合起来。不过,这里似乎没有一个“规则”——:previous-page:next-page:count 似乎是“最后一个获胜”,但 :items seems to be something like#(into [] %)`。一旦您可以清楚地将该规则声明为函数:

(fn combine [map1 map2] ...)

然后,您可以使用您定义的 combine 轻松地将地图与 merge-with 合并。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2012-02-06
    • 2012-03-21
    • 1970-01-01
    相关资源
    最近更新 更多