如何在Clojure中过滤多个值或通配符?

时间:2013-04-25 16:14:19

标签: clojure filter

我正在尝试过滤各种字符串上的键。我可以像这样过滤一个固定的字符串:

(filter #(= (:TEST_KEY %) "TEST: 1")records)

虽然有效,但我还需要包含" TEST: 2""TEST: ABC"。如何让过滤器处理多个值?有没有办法过滤我不知道的"TEST: *"这样的通配符?

2 个答案:

答案 0 :(得分:3)

Michiel Borkent的回答涵盖了通配符案例。在有一组枚举选项的情况下,clojure允许使用文字集作为测试成员资格的函数。这可以与filter一起使用(因为在clojure中除了nil或false之外的所有值都是真的)。​​

user> (#{"A" "B"} "A")
;;=> "A"
user> (#{"A" "B"} "C")
;;=> nil

我使用comp创建一个函数,该函数首先在记录中查找键,然后使用集合对其进行测试:

(filter (comp #{"TEST: 1" "TEST: 2" "TEST: ABC"} :TEST_KEY) records)

请注意,上面的#{}语法是一个集合文字,与#()匿名函数语法无关。

答案 1 :(得分:2)

(filter #(.startsWith (:TEST_KEY % "") "TEST: ")      
        [{:TEST_KEY "TEST: 1"} {:TEST_KEY "TEST: 2"} {:NONSENSE "foo"}])

;; or equivalently

(filter #(re-find #"TEST: .*"        ;; use regular expression to match
                  (:TEST_KEY % ""))  ;; get value of :TEST_KEY, 
                                     ;; use empty string as default 
        [{:TEST_KEY "TEST: 1"} {:TEST_KEY "TEST: 2"} {:NONSENSE "foo"}])
;;=> ({:TEST_KEY "TEST: 1"} {:TEST_KEY "TEST: 2"})