Clojure如何混合/合并两个地图



我是 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将地图与任意函数组合在一起。这里似乎没有一个"规则"——对于:previous-page:next-page:count似乎是"最后一个赢了",但:items seems to be something like #(into [] %)。一旦你可以清楚地将该规则声明为一个函数:

(fn combine [map1 map2] ...)

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

最新更新