我有一个 clojure 函数,它返回一系列 1 键映射。我想将这些地图合并成一张地图;但是,如果有具有相同键的映射,我不想覆盖这些值,只想将它们组合成一个向量。merge似乎覆盖,并且merge-with似乎严重扭曲了类型。
我有:
({:foo "hello"}
 {:bar "world"} 
 {:baz "!!!"}
 {:ball {:a "abc", :b "123"}}
 {:ball {:a "def", :b "456"}}
 {:ball {:a "ghi", :b "789"}})
我想要:
{:foo "hello"
 :bar "world"
 :baz "!!!"
 :ball [{:a "abc", :b "123"} {:a "def", :b "456"} {:a "ghi", :b "789"}]}
谢谢。
(def data ...) ;; your list of maps
(apply merge-with (comp flatten vector) data)
;; => {:baz "!!!", :ball ({:b "123", :a "abc"} {:b "456", :a "def"} {:b "789", :a "ghi"}), :bar "world", :foo "hello"}
注意:使用flattenOP 的情况下有效,但不是在创建属于冲突键的值向量时合并映射的通用方法。