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