您可以merge-with
在示例中使用如下所示的功能。
首先,我们定义一些辅助函数
(defn collect [& xs]
(apply vector (-> xs distinct sort)))
该collect
函数确保其中的项目xs
是唯一的且已排序,并最终以向量的形式返回它们。
(defn merge-keys [k xs]
(map #(apply merge-with collect %) (vals (group-by k xs))))
merge-keys
xs
首先通过主键(在您的情况下)对哈希映射进行分组,获取每个分组项目列表并使用上面的函数:id
合并键的值。collect
(def xs [{:id 1, :region :NA, :name :Test1, :OS :W}
{:id 1, :region :EU, :name :Test2, :OS :W}
{:id 2, :region :AS, :name :test3, :OS :L}
{:id 2, :region :AS, :name :test4, :OS :M}])
(merge-keys :id xs)
=> ({:id [1],
:region [:EU :NA],
:name [:Test1 :Test2],
:OS [:W]}
{:id [2],
:region [:AS],
:name [:test3 :test4],
:OS [:L :M]})
但是请注意,即使是:id
键现在也有与之关联的向量。您可以通过引入将单个值与键而不是向量相关联的语句来轻松地取消向量...if
collect
(defn collect [& xs]
(let [cs (apply vector (-> xs distinct sort))]
(if (= 1 (count cs)) (first cs) cs)))
...或从那里获取结果merge-keys
并执行
(map #(update-in % [:id] first) result)
这只会取消矢量:id
地图条目