Спасибо за ответ! Извините за недостаточно четкое объяснение, в чем проблема ... Не могли бы вы проверить обновленный вопрос ?! Благодарю.
оложим, у нас есть такая структура данных:
(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"}]))
Я научился фильтровать его по одному ключу, например:
(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})
Но теперь я немного запутался в том, как фильтровать данные по:first-name
, :last-name
а также:age
простой способ?
Обновить: S, извините за то, что не слишком ясно объяснил, в чем проблема ... На самом деле, я хочу все ключи:first-name
, :last-name
а также:age
участвовать в функции фильтра, так что, еслиstr-input
не совпадает:first-name
Вал, проверьте, если это соответствует:last-name
Вальс и тд.
Обновление 2: После попыткиsome-fn
, every-pred
а такжеtransducers
Я не получил то, что мне нужно, например регулярные выражения в предикатах фильтра, я полагаю, на данный момент это недостаток знаний. Итак, я получил эту функцию, которая прекрасно работает, но код уродлив и дублирован. Как я могу избавиться от дублирования кода?
(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)))))