noch eine andere Möglichkeit, es zu tun, ein bisschen mehr idiomatisch, ich denke:
(let [items [{ :name "John" :email "[email protected]" }
{ :name "Batman" :email "[email protected]" }
{ :name "John Doe" :email "[email protected]" }]]
(map first (vals (group-by :email items))))
Ausgang:
({:name "John", :email "[email protected]"}
{:name "Batman", :email "[email protected]"})
das ist, wie es funktioniert:
(group-by :email items)
eine Karte macht, deren Schlüssel sind E-Mails und Werte sind Gruppen von Datensätzen mit dieser E-Mail
{"[email protected]" [{:name "John", :email "[email protected]"}
{:name "John Doe", :email "[email protected]"}],
"[email protected]" [{:name "Batman", :email "[email protected]"}]}
dann müssen Sie nur seine Vals (Gruppen von Datensätzen) nehmen und wählen Sie erste aus ihnen.
Und eine andere Art und Weise ist eine per E-Mail-Set sortiert zu erstellen, damit es alle Datensätze mit der gleichen E-Mails als gleichwertige Aufzeichnungen behandeln:
(let [items [{ :name "John" :email "[email protected]" }
{ :name "Batman" :email "[email protected]" }
{ :name "John Doe" :email "[email protected]" }]]
(into (sorted-set-by #(compare (:email %1) (:email %2))) items))
Ausgang:
#{{:name "Batman", :email "[email protected]"}
{:name "John", :email "[email protected]"}}
don‘ Ich weiß wirklich, welche von ihnen ist idiomatischer und hat eine bessere Leistung. Aber ich wette auf den ersten.
Da Schlüsselwörter Funktionen sind, ein idiomatischer Aufruf wäre '(distinct-by: E-Mail-Karten) ' – Alex