Clojure / ClojureScript中的不区分大小写的过滤器

时间:2014-04-20 19:08:02

标签: clojure clojurescript

我有这个功能:

(defn list-data [alist filter-text]
 (filter (fn [x] (if (nil? filter-text) true
                     (> (.indexOf x filter-text) -1))) alist))

(list-data ["Lion" "Zebra" "Buffalo" "Antelope"] "a")
;=> ("Zebra" "Buffalo")

是否有更惯用的方式来编写此函数并尊重我不想要区分大小写的过滤器这一事实,这意味着我希望(list-data ["Lion" "Zebra" "Buffalo" "Antelope"] "a")返回以下内容:

;=> ("Zebra" "Buffalo" "Antelope")

谢谢!

(这需要在.cljs文件中工作)

2 个答案:

答案 0 :(得分:13)

在Clojure中,你通常会用正则表达式来做这件事。在Java正则表达式中,您可以通过为要进行的匹配提供不区分大小写的标志,或者在全局不区分大小写的正则表达式的开头为此执行此操作:

  (filter #(re-find #"(?i)a" %)
          ["Lion" "Zebra" "Buffalo" "Antelope"])

纯Javascript正则表达式仅支持全局标志。它们以字符串形式给出,作为正则表达式构造函数的第二个参数:

  (filter #(re-find (js/RegExp. "a" "i") %)
          ["Lion" "Zebra" "Buffalo" "Antelope"])

然而,为了方便并保持Java和Javascript之间的正则表达式相似,Clojurescript阅读器将全局java样式标志(正则表达式开头的那些)转换为它们的Javascript全局等价物。

所以第一个例子也适用于Clojurescript。请注意,非全局标志在Clojurescript中不起作用,它们可以在Clojure中工作。

答案 1 :(得分:4)

(defn list-data [alist filter-text]
 (if-let [filter-text (some-> filter-text not-empty .toLowerCase)]
   (filter #(-> % 
                .toLowerCase 
                (.indexOf filter-text)
                (not= -1)) 
           alist)
   alist))