Clojure - мән шын болса, кілттер жиынын жасаңыз

Мен мақтаныш үшін мүлдем жаңа.

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

Мен құндылыққа сәйкес келетін кілттер жиынтығын жасағым келеді. Бұл мысалда алап [«1», «3»] болуы керек.

Өтінемін маған көмектесіңіз. Кез келген көмекті бағалайтын болар еді.

0
Бұл өте кең. Сіз не істедік? Мен жалған мәнді сүзгілеу үшін filter -ні қараңыз.
қосылды автор Carcigenicate, көзі
@jstuartmilne Жұптардың кілттері ақиқат құндылықпен қалағандай көрінеді.
қосылды автор Carcigenicate, көзі
Мен бұл мәселені түсінбеймін. Сіз тек кілттерді алғыңыз келе ме?
қосылды автор jstuartmilne, көзі
Clojure-ге қош келдіңіз, мен деректерді пайдалансаңыз деп ойлаймын. json немесе cheshire, Джсонды Clojure картасына түсіру үшін. картадан картаны кілттермен сүзуді жасағаннан кейін (leetwinski-ның жауабында бірінші мысал) жұмыс істейді. Себебі, карталарды сүзгі қабылдайтын функциялар сияқты қарастыруға болады.
қосылды автор 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
қосылды
key және val картасының жұбының кілтін және мәнін қайтару үшін бұрыннан бар, сондықтан let байланысы қажетсіз.
қосылды автор Lee, көзі
@ Рақмет! Мен бұл туралы ұмытып кеттім. Жауапты сәйкес жаңартты
қосылды автор Edward Minnix, көзі

Бұл үшін Tupelo кітапханасында функциясы орнатылған:

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

Содан кейін алынған картадағы keys функциясын қолдануға болады.

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
қосылды
Стильді айту: егер сіз - >> секілді жіптерді қолданатын макростарды пайдалансаңыз, «бірінші» дәлелін бірінші орынға шығарыңыз. Мысалы: (- a (сүзгі (,)) (карта (,))
қосылды автор cfrick, көзі
Мен тырысты (- (сүзгі (fn [[kv]] v) дәмдік идентификаторлар) (map (fn [[kv]] k))) Бірақ қате пайда болды «Қатерлі қате: «деректер».
қосылды автор Tessy Thomas, көзі

Ұсынылғандай, карталарда ғана болу.

(кілттер (сүзгіші val m))

0
қосылды