Спасибо за ответ! Извините за недостаточно четкое объяснение, в чем проблема ... Не могли бы вы проверить обновленный вопрос ?! Благодарю.

оложим, у нас есть такая структура данных:

(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)))))