在不覆盖键的情况下合并地图

Cam*_*ook 5 clojure

我有一个 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"}})
Run Code Online (Sandbox Code Playgroud)

我想要:

{:foo "hello"
 :bar "world"
 :baz "!!!"
 :ball [{:a "abc", :b "123"} {:a "def", :b "456"} {:a "ghi", :b "789"}]}
Run Code Online (Sandbox Code Playgroud)

谢谢。

Kyl*_*yle 4

(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"}
Run Code Online (Sandbox Code Playgroud)

注意:使用flattenOP 的情况下有效,但不是在创建属于冲突键的值向量时合并映射的通用方法。

  • 最好希望被合并的值都不是向量。 (2认同)