Como filtrar o vetor de mapas por várias chaves no Clojure
Suponha que temos uma estrutura de dados como esta:
(def data
(atom [{:id 1 :first-name "John1" :last-name "Dow1" :age "14"}
{:id 2 :first-name "John2" :last-name "Dow2" :age "54"}
{:id 3 :first-name "John3" :last-name "Dow3" :age "34"}
{:id 4 :first-name "John4" :last-name "Dow4" :age "12"}
{:id 5 :first-name "John5" :last-name "Dow5" :age "24"}]))
Aprendi como filtrá-lo por uma chave, por exemplo:
(defn my-filter
[str-input]
(filter #(re-find (->> (str str-input)
(lower-case)
(re-pattern))
(lower-case (:first-name %)))
@data))
> (my-filter "John1")
> ({:last-name "Dow1", :age "14", :first-name "John1", :id 1})
Mas agora estou um pouco confuso sobre como filtrar dados:first-name
, :last-name
e:age
maneira simples?
Atualizar: S, orry por não ser muito claro o suficiente para explicar qual é o problema ... Na verdade, eu quero todas as chaves:first-name
, :last-name
e:age
paticipar na função de filtro, para que, sestr-input
não corresponde:first-name
val, verifique se ele corresponde:last-name
é val e assim por diante.
Atualização 2: Depois de tentarsome-fn
, every-pred
etransducers
, Não recebi o que preciso, por exemplo regex em predicados de filtro, acho que é falta de conhecimento por enquanto. Então, acabei com essa função que funciona bem, mas o código é feio e duplicado. Como posso me livrar da duplicação de código?
(defn my-filter [str-input]
(let [firstname (filter #(re-find (->> (str str-input)
(upper-case)
(re-pattern))
(upper-case (:first-name %)))
@data)
lastname (filter #(re-find (->> (str str-input)
(upper-case)
(re-pattern))
(upper-case (:last-name %)))
@data)
age (filter #(re-find (->> (str str-input)
(upper-case)
(re-pattern))
(upper-case (:age %)))
@data)]
(if-not (empty? firstname)
firstname
(if-not (empty? lastname)
lastname
(if-not (empty? age)
age)))))