Clojure初学者在这里..
如果我有一组地图,例如
(def kids #{{:name "Noah" :age 5}
{:name "George":age 3}
{:name "Reagan" :age 1.5}})
我知道我可以得到这样的名字
(map :name kids)
1)如何选择特定地图?例如 我想找回name =“Reagan”的地图。
{:name "Reagan" :age 1.5}
可以使用过滤器完成吗?
2)如果年龄= 3,请返回姓名?
答案 0 :(得分:8)
是的,您可以使用filter
:
(filter #(= (:name %) "Reagan") kids)
(filter #(= (:age %) 3) kids)
答案 1 :(得分:6)
有clojure.set/select
:
(clojure.set/select set-of-maps #(-> % :age (= 3)))
与name
和"Reagan"
类似。在这种情况下,返回值将是一个集合。
您也可以使用filter
而无需任何特殊准备,因为filter
在其集合参数上调用seq
(编辑:正如我在输入时已经由ffriend描述的那样) :
(filter #(-> % :age (= 3))) set-of-maps)
这里的返回值将是一个懒惰的序列。
如果你知道在集合中只有一个项目满足你的谓词,some
会更有效率(因为它在找到匹配后不会处理任何其他元素):
(some #(if (-> % :age (= 3)) %) set-of-maps)
此处的返回值将是匹配元素。