Clojure将多个地图合并为一个地图

13 list clojure map

我有以下地图列表

({"child.search" {:roles #{"ROLE_ADM_UNSUBSCRIBE_SUBSCRIPTION" "ROLE_ADM_SEARCH_SUBSCRIPTION" "ROLE_ADM_VIEW_SUBSCRIPTION"}},
  "child.cc.search" {:roles #{"ROLE_ADM_CC_SEARCH_SUBSCRIPTION" "ROLE_ADM_CC_VIEW_SUBSCRIPTION"}}}
  {"child.abusereport" {:roles #{"ROLE_ADM_ABUSE_RPT"}},
   "child.manualfiltering" {:roles #{"ROLE_ADM_MANUAL_FILTERING_RPT"}}}
  {"child.assigned.advertisement" {:roles #{"ROLE_ADM_CREATE_ADVERTISING"}},
   "child.manage.advertisement" {:roles #{"ROLE_ADM_LIST_ADVERTISING"}}})
Run Code Online (Sandbox Code Playgroud)

我需要有一个像下面这样的地图.

{"child.search" {:roles #{"ROLE_ADM_UNSUBSCRIBE_SUBSCRIPTION" "ROLE_ADM_SEARCH_SUBSCRIPTION" "ROLE_ADM_VIEW_SUBSCRIPTION"}}
"child.cc.search" {:roles #{"ROLE_ADM_CC_SEARCH_SUBSCRIPTION" "ROLE_ADM_CC_VIEW_SUBSCRIPTION"}}
"child.abusereport" {:roles #{"ROLE_ADM_ABUSE_RPT"}}
"child.manualfiltering" {:roles #{"ROLE_ADM_MANUAL_FILTERING_RPT"}}
"child.assigned.advertisement" {:roles #{"ROLE_ADM_CREATE_ADVERTISING"}}
"child.manage.advertisement" {:roles #{"ROLE_ADM_LIST_ADVERTISING"}}}
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

Sco*_*ott 12

您可以使用" into "函数,并提供一个空映射{}作为第一个参数:

(into {} map-list)
Run Code Online (Sandbox Code Playgroud)

这是我的REPL会话的输出; 我将你的代码复制到两个vars'map-list'和'single-map'(Clojure 1.3.0):

(def map-list '({"child.search" {:roles #{"ROLE_ADM_UNSUBSCRIBE_SUBSCRIPTION" "ROLE_ADM_SEARCH_SUBSCRIPTION" "ROLE_ADM_VIEW_SUBSCRIPTION"}},
                 "child.cc.search" {:roles #{"ROLE_ADM_CC_SEARCH_SUBSCRIPTION" "ROLE_ADM_CC_VIEW_SUBSCRIPTION"}}}
                {"child.abusereport" {:roles #{"ROLE_ADM_ABUSE_RPT"}},
                 "child.manualfiltering" {:roles #{"ROLE_ADM_MANUAL_FILTERING_RPT"}}}
                {"child.assigned.advertisement" {:roles #{"ROLE_ADM_CREATE_ADVERTISING"}},
                 "child.manage.advertisement" {:roles #{"ROLE_ADM_LIST_ADVERTISING"}}}))

#'user/map-list
user=>
(def single-map {"child.search" {:roles #{"ROLE_ADM_UNSUBSCRIBE_SUBSCRIPTION" "ROLE_ADM_SEARCH_SUBSCRIPTION" "ROLE_ADM_VIEW_SUBSCRIPTION"}}
                 "child.cc.search" {:roles #{"ROLE_ADM_CC_SEARCH_SUBSCRIPTION" "ROLE_ADM_CC_VIEW_SUBSCRIPTION"}}
                 "child.abusereport" {:roles #{"ROLE_ADM_ABUSE_RPT"}}
                 "child.manualfiltering" {:roles #{"ROLE_ADM_MANUAL_FILTERING_RPT"}}
                 "child.assigned.advertisement" {:roles #{"ROLE_ADM_CREATE_ADVERTISING"}}
                 "child.manage.advertisement" {:roles #{"ROLE_ADM_LIST_ADVERTISING"}}})
#'user/single-map

user=>
;; Check to see if we have the desired result
(= (into {} map-list)
   single-map)
true
Run Code Online (Sandbox Code Playgroud)

  • 一个警告 - 如果存在多个映射中的键,则只有来自最后一个映射的值才会在组合映射中结束.如果这不是你想要的,请看[`merge-with`](http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/merge-with) (5认同)

Ret*_*ief 7

我可能会用mergeapply

(def map-list (list {:a 1, :b 2} {:c 3, :d 4}))
(apply merge map-list) ;; returns {:a 1, :b 2, :c 3, :d 4}
Run Code Online (Sandbox Code Playgroud)