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

时间:2017-01-19 16:21:28

标签: clojure hashmap

我是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"}]}} 

1 个答案:

答案 0 :(得分:3)

您可以使用merge-with将地图与任意函数组合在一起。这里似乎没有一个"规则"虽然 - :previous-page:next-page:count似乎是"最后一个获胜"但是:items seems to be something like#(进入[]%)`。一旦你可以清楚地说明这条规则是一个功能:

(fn combine [map1 map2] ...)

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