Я не могу найти встроенные функции в Clojure для фильтрации списка карт по значениям ключей. Например, у нас есть следующий список:Простой способ фильтрации списка карт по значениям ключей в Clojure
user=> (def animals (list {:name "Charlie" :weight 350 :specie :elephant}
{:name "Vasya" :weight 250 :specie :bear}
{:name "John" :weight 200 :specie :elephant}
{:name "Monk" :weight 200 :specie :monkey}))
#'user/animals
И я хочу, чтобы выбрать, например, все :specie
со значением :elephant
. Как я могу это сделать? Лучший способ узнать это:
user=> (defn filter-data [data m]
(let [k (keys m) v (vals m)]
(filter #(= (map % k) v) data)))
#'user/filter-data
user=> (clojure.pprint/print-table (filter-data animals {:specie :elephant}))
| :name | :weight | :specie |
|---------+---------+-----------|
| Charlie | 350 | :elephant |
| John | 200 | :elephant |
nil
Есть ли лучший способ сделать это?
Вы должны перефразировать ваш вопрос, что делает его более ясным, что вы хотите, чтобы функция получить карту как '{: монета: слон } ', иначе можно предположить, что вы просто хотели отфильтровать, используя простой предикат. – Setzer22
Ваша функция в порядке, если вы хотите добавить больше ключей или значений привязок на свою карту. –