1

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

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

虽然这有效,但我还需要能够包含 "TEST: 2""TEST: ABC"。我怎样才能让过滤器对多个值起作用?有没有办法像"TEST: *"我不知道的那样过滤通配符?

4

2 回答 2

3

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)

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

于 2013-04-25T18:12:42.633 回答
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"})
于 2013-04-25T17:06:37.753 回答