clojure地图集 - 基本过滤

Rob*_*ler 4 clojure

Clojure初学者在这里..

如果我有一组地图,例如

 (def kids #{{:name "Noah" :age 5}
     {:name "George":age 3}
     {:name "Reagan" :age 1.5}})  
Run Code Online (Sandbox Code Playgroud)

我知道我可以得到这样的名字

  (map :name kids)
Run Code Online (Sandbox Code Playgroud)

1)如何选择特定地图?例如,我想找回name ="Reagan"的地图.

 {:name "Reagan" :age 1.5}
Run Code Online (Sandbox Code Playgroud)

可以使用过滤器完成吗?

2)如果返回年龄= 3的名字怎么样?

ffr*_*end 8

是的,你可以这样做filter:

(filter #(= (:name %) "Reagan") kids)

(filter #(= (:age %) 3) kids)
Run Code Online (Sandbox Code Playgroud)


Mic*_*zyk 6

clojure.set/select:

(clojure.set/select set-of-maps #(-> % :age (= 3)))
Run Code Online (Sandbox Code Playgroud)

而同样有name"Reagan".在这种情况下,返回值将是一个集合.

您也可以在filter没有任何特殊准备的情况下使用,因为filter调用seq它的集合参数(编辑:正如我在输入时已经由ffriend描述的那样):

(filter #(-> % :age (= 3))) set-of-maps)
Run Code Online (Sandbox Code Playgroud)

这里的返回值将是一个懒惰的seq.

如果你知道在集合中只有一个项目满足你的谓词,那么some效率会更高(因为它在找到匹配后不会处理任何其他元素):

(some #(if (-> % :age (= 3)) %) set-of-maps)
Run Code Online (Sandbox Code Playgroud)

这里的返回值将是匹配元素.