clojure - Filter a collection by multiple attributes provided with a map -


i have collection want filter. filter done using map key attribute in collection item, , value collection items should match. example:

(let [filters {:name "test"                :type "new"}       collection [{:name "testable"  :type "old"}                   {:name "shoudwork" :type "new"}                   {:name "testable"  :type "new"}]]) 

right now, have built filter function take single attribute , value. want expand able take filter hashmap.

this current filter looks like:

(filter #(re-find (re-pattern "test") (string/lower-case (% :name))) collection) 

in other words, want filter not take "test" hardcoded, should value filters let binding, , (% :name) not hardcoded :name, key filters let binding.

create function returns filtering function single [key expected-value]:

(defn regex-value [[k expected-rex]]   (fn [c] (re-find (re-pattern expected-rex)                     (clojure.string/lower-case (get c k))))) 

create function create compounded filtering condition:

(defn build-filter [filters]   (apply every-pred (map regex-value filters))) 

use it:

(let [filters {:name "test"                :type "new"}       collection [{:name "testable"  :type "old"}                   {:name "shoudwork" :type "new"}                   {:name "testable"  :type "new"}]]   (filter (build-filter filters) collection)) 

Comments

Popular posts from this blog

ruby - Trying to change last to "x"s to 23 -

jquery - Clone last and append item to closest class -

c - Unrecognised emulation mode: elf_i386 on MinGW32 -