我正在尝试过滤各种字符串上的键。我可以像这样过滤一个固定的字符串:
(filter #(= (:TEST_KEY %) "TEST: 1")records)
虽然有效,但我还需要包含" TEST: 2"
和"TEST: ABC"
。如何让过滤器处理多个值?有没有办法过滤我不知道的"TEST: *"
这样的通配符?
答案 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"})