在Clojure程序中,我有一个由包含人名和电子邮件的地图组成的数组。
e.g。
[
{ :name "John" :email "john@gmail.com" }
{ :name "Batman" :email "batman@gmail.com" }
{ :name "John Doe" :email "john@gmail.com" }
]
我想删除重复的条目,为了进行比较,考虑具有相同电子邮件的对等于。在上面的示例中,输出将是:
[
{ :name "John" :email "john@gmail.com" }
{ :name "Batman" :email "batman@gmail.com" }
]
在Clojure中实现这一目标的最佳方法是什么?有没有办法让不同的人知道什么等于使用函数?
感谢。
答案 0 :(得分:7)
这样做:https://crossclj.info/fun/medley.core/distinct-by.html。
链接中的功能会懒洋洋地浏览每个值,并存储它所看到的所有内容。如果已经看到coll
中的值,则不会添加它。
然后,您可以将其称为:(distinct-by #(% :email) maps)
,其中maps
是人物地图的矢量。
答案 1 :(得分:1)
distinct-by
可以很容易地实现为
(defn distinct-by [f coll]
(let [groups (group-by f coll)]
(map #(first (groups %)) (distinct (map f coll)))))
对于示例案例,可以像
一样使用(distinct-by :email
[{:name "John" :email "john@gmail.com"}
{:name "Batman" :email "batman@gmail.com"}
{:name "John Doe" :email "john@gmail.com"}])