2016-05-20 7 views
3

Ich habe zwei Liste der KartenMerge Liste der Karten von UUID

(def map1 ({:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c0", :book/name "AAA"} 
      {:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c3", :book/name "CCC"})) 

und

(def map2 ({:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c3", :book/author "John"} 
      {:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c0", :book/author "Alan"})) 

und ich möchte dies durch UUID Karten verschmelzen lassen folgende

({:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c0", :book/name "AAA", :book/author "Alan"} 
{:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c3", :book/name "CCC", :book/author "John"}) 

Was Wie kann ich es tun?

Antwort

2
(defn group-by-id [m] 
    (->> m 
     (map (juxt :book/public-id identity)) 
     (into {}))) 

(vals (merge-with merge (group-by-id map1) (group-by-id map2))) 
2

Wenn Sie Vektoren anstelle von Listen hatten, können Sie diese Sätze auf passende Werte fusionieren JOIN:

user=> (def map1 [{:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c0", :book/name "AAA"} 
    #_=>   {:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c3", :book/name "CCC"}]) 
#'user/map1 
user=> (def map2 [{:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c3", :book/author "John"} 
    #_=> {:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c0", :book/author "Alan"}]) 
#'user/map2 
user=> (clojure.set/join map1 map2) 
#{{:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c3", :book/name "CCC", :book/author "John"} {:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c0", :book/name "AAA", :book/author "Alan"}} 
1

Sie merge verwenden können, das zu tun. Ich habe die Vars umbenannt, um es ein wenig klarer zu machen. Außerdem habe ich Vektoren, die Sammlung zu stellen, wie die mehr idiomatische ist:

(def titles 
    [{:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c0" 
    :book/name "AAA"} 
    {:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c3" 
    :book/name "CCC"}]) 

(def authors 
    [{:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c3" 
    :book/author "John"} 
    {:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c0" 
    :book/author "Alan"}]) 

(def prices 
    [{:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c3" 
    :book/price 25}]) 

ich Preise var geschaffen, um zu zeigen, dass die Vektoren müssen nicht die gleiche Größe sein. Der erste Schritt wäre, jede Buchinformation in einer Struktur zu gruppieren, und dann können wir merge verwenden, um eine Karte pro Buch zu erhalten. Um dies zu erreichen, können wir group-by verwenden:

(def book-info-by-uuid 
    (group-by :book/public-id (concat titles authors prices))) 

Was uns eine Karte mit UUID als Schlüssel und einen Vektor mit allen Infos jedes Buch als Werte geben:

{#uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c0" 
[{:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c0" 
    :book/name "AAA"} 
    {:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c0" 
    :book/author "Alan"}] 

#uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c3" 
[{:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c3" 
    :book/name "CCC"} 
    {:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c3" 
    :book/author "John"} 
    {:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c3" 
    :book/price 25}]} 

Schließlich verwenden wir Zusammenführen, um das Ergebnis zu erhalten:

(map #(apply merge %) 
     (vals books-by-uuid)) 

({:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c0" 
    :book/name "AAA" 
    :book/author "Alan"} 
{:book/public-id #uuid "555b6f35-4e8c-42c5-bb80-b4d9147394c3" 
    :book/name "CCC" 
    :book/author "John" 
    :book/price 25}) 
Verwandte Themen