Clojure - qiymati to'g'ri bo'lsa kalitlarning majmuasini yarating

Men shafqatsizlik uchun butunlay yangi.

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

Qiymat haqiqatdan ham to'g'ri bo'lgan qator kalitlarni yaratmoqchiman. Ushbu misolda qator ["1", "3"] bo'lishi kerak.

Iltimos, menga yordam bering. Har qanday yordamni qadrlash kerak.

0
Bu juda keng. Siz nimani sinab ko'rdingiz? Noto'g'ri qiymati bilan filtrlash uchun ham filter ga qarayman.
qo'shib qo'ydi muallif Carcigenicate, manba
@jstuartmilne Juftlarning kalitlari haqiqat qiymati bilan bo'lishini xohlaydi.
qo'shib qo'ydi muallif Carcigenicate, manba
Men savolni tushunmayapman. Siz faqat kalitlarni xohlaysizmi?
qo'shib qo'ydi muallif jstuartmilne, manba
Clojurega xush kelibsiz, men Csonjur xaritasiga jonsonni yuborish uchun data.json yoki cheshiredan foydalanmoqchiman. so'ngra tugmachalar yordamida xaritani filtrlashni (leetwinski ning javobidagi birinchi misol) bajarishingiz kerak. Buning sababi, xaritalarni filtrlaydigan funksiyalar kabi muomalada bo'lishi mumkin.
qo'shib qo'ydi muallif Gary, manba
Ha, haqiqiy qiymat bilan tugmachalar qatorini istayman.
qo'shib qo'ydi muallif Tessy Thomas, manba

6 javoblar

Buning uchun ikkita qisqa va oddiy parchalar ham bor:

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
qo'shib qo'ydi
Ajoyib! Bu ishlay boshladi. Katta rahmat.
qo'shib qo'ydi muallif Tessy Thomas, manba

Agar siz bir qator vektordan foydalansangiz yaxshi bo'ladi (odatda Clojure-da vektorlardan foydalanganingiz uchun), siz kabi bir narsa qilishingiz mumkin.

(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
qo'shib qo'ydi
Let va val kodlari kalitini va xaritani juftligini qaytarish uchun allaqachon mavjud.
qo'shib qo'ydi muallif Lee, manba
Shukur! Buni unutgan edim. Mening javoblarim yangilandi
qo'shib qo'ydi muallif Edward Minnix, manba

Buning uchun Tupelo kutubxonasida funktsiyasi joylashgan:

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

Keyinchalik olingan xaritada keys funksiyasidan foydalanishingiz mumkin.

0
qo'shib qo'ydi

Balki bu?

(->> foo (filter second) keys)

qaerda foo xarita.

0
qo'shib qo'ydi

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
qo'shib qo'ydi
Style nitpicking: agar siz - >> kabi tirnash makrosini ishlatsangiz, «birinchi» argumentni ham birinchi joyga olib chiqing. Masalan, (- a (filtri (,)) (xarita (,)))
qo'shib qo'ydi muallif cfrick, manba
(Fn [[kv]] v) lazzat-idlar bilan sinab ko'rdim (map (fn [[kv]] k))) Lekin xatoga yo'l qo'yaman "Unchaught Error: Oops, "ma'lumotlar".
qo'shib qo'ydi muallif Tessy Thomas, manba

Ko'rsatilgan narsalar bilan bir xilda, faqatgina xaritalarda turish.

(tugmachalari (filter val m))

0
qo'shib qo'ydi