我正在尝试过滤各种字符串上的键。我可以像这样过滤一个固定的字符串:
(filter #(= (:TEST_KEY %) "TEST: 1")records)
虽然这有效,但我还需要能够包含 "TEST: 2"
和"TEST: ABC"
。我怎样才能让过滤器对多个值起作用?有没有办法像"TEST: *"
我不知道的那样过滤通配符?
Michiel Borkent 的回答涵盖了通配符的情况。如果有一组枚举选项,clojure 允许使用文字集作为测试成员资格的函数。这可以习惯性地使用filter
(因为除了 nil 或 clojure 中的 false 之外的所有值都是真实的)。
user> (#{"A" "B"} "A")
;;=> "A"
user> (#{"A" "B"} "C")
;;=> nil
我comp
用来创建一个函数,它首先在记录中查找键,然后用一组测试它:
(filter (comp #{"TEST: 1" "TEST: 2" "TEST: ABC"} :TEST_KEY) records)
请注意,上面的语法是一个集合文字,与匿名函数语法#{}
无关。#()
(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"})