Clojure - Создайте множество ключей, если стоимость верна

Я полностью плохо знаком с clojure.

I have a JSON like: { "1": true, "2": false, "3": true, "4": false }

Я хочу создать множество ключей, для которых стоимость верна в clojure. В этом примере множество должно быть ["1", "3"] .

Пожалуйста, помоги мне. Любая помощь ценилась бы.

0
Это довольно широко. Что вы попробовали? I' d изучают фильтр также, чтобы отфильтровать записи с ложной стоимостью.
добавлено автор Carcigenicate, источник
@jstuartmilne Кажется, что они хотят ключи пар со стоимостью truthy.
добавлено автор Carcigenicate, источник
Я не понимаю вопроса. Вы подразумеваете, что только хотите ключи?
добавлено автор jstuartmilne, источник
добро пожаловать в Clojure, I' m принимающий you' ре используя data.json или Чешир, чтобы выстроить json в карту Clojure. однажды you' ve, сделанный, что, тогда фильтруя карту ключами (первый пример в leetwinski' s ответ), будет работать. Это вызвано тем, что карты можно рассматривать как функции, которые берет фильтр.
добавлено автор Gary, источник
Да, я хочу множество ключей с истинным значением.
добавлено автор Tessy Thomas, источник

6 ответы

есть также несколько коротких и простых отрывков для этого:

user> (filter m (keys m))
;;=> ("1" "3")

user> (keep (fn [[k v]] (when v k)) m)
;;=> ("1" "3")

user> (for [[k v] m :when v] k)
;;=> ("1" "3")
7
добавлено
Большой! Это работало. Большое спасибо.
добавлено автор Tessy Thomas, источник

Если вы соглашаетесь с использованием вектора вместо множества (так как вы обычно используете векторы в Clojure так или иначе), можно сделать что-то как.

(defn keys-for-truthy-vals [m]
  (->> m (filter val) (mapv key)))

Note The mapv is only so the map call returns a vector. If you want a seq, just use map.

3
добавлено
ключ и val уже существует, чтобы возвратить ключ и ценность пары карты, таким образом, позволяют крепления, ненужный.
добавлено автор Lee, источник
@Lee Спасибо! я забыл об этом. Обновленный мой ответ соответственно
добавлено автор Edward Minnix, источник

Есть встроенная функция в библиотеке Тупело для этого:

(submap-by-vals map-arg keep-vals & opts)

Returns a new map containing entries with the specified vals. Throws for missing vals,
unless `:missing-ok` is specified. Usage:

(submap-by-vals {:a 1 :b 2 :A 1} #{1  }             )  =>  {:a 1 :A 1}
(submap-by-vals {:a 1 :b 2 :A 1} #{1 9} :missing-ok )  =>  {:a 1 :A 1} 

Вы могли тогда просто использовать ключи функция на получающейся карте.

0
добавлено

Возможно, это?

(->> foo (filter second) keys)

где foo - карта.

0
добавлено

If your map is a Something like (->> (filter (fn [[k v]] v) a) (map (fn [[k v]] k))) will work. You can't do it with just a map because you need to drop certain values, so there will need to be some reducing or filtering.

0
добавлено
Мелочные придирки стиля: если вы используете макрос пронизывания как ->> , то потяните "первый" аргумент также в первое место. Например, (->> (фильтр ()) (карта ()))
добавлено автор cfrick, источник
Я попробовал (->> (фильтр (fn [[k v]] v) иды аромата) (карта (fn [[k v]] k))), Но я получаю ошибку "Непойманная Ошибка: ой, Пропуская ожидаемый ключ объекта ' data'";.
добавлено автор Tessy Thomas, источник

То же самое как уже, если, просто оставшись в картах.

(ключи (фильтруют val m)),

0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Clojure — русскоговорящее сообщество
Clojure — русскоговорящее сообщество
433 участник(ов)

Общаемся на темы, посвященный Clojure. Решаем проблемы, обмениваемся опытом и делимся новостями. Вакансии и поиск работы: @clojure_jobs Вам могут быть интересны: @javascript_ru, @nodejs_ru, @ruby_ru, @devops_ru, @devops_jobs