मैं क्लोजर के लिए बिल्कुल नया हूँ।
मेरे पास एक JSON है जैसे: { "1": true, "2": false, "3": true, "4": false }
मैं चाबियों की एक सरणी बनाना चाहता हूं जिसके लिए क्लोजर में मान सत्य है। इस उदाहरण में सरणी ["1", "3"]
होनी चाहिए।
क्रिप्या मेरि सहायता करे। किसी भी सहायता की सराहना की जाएगी।
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")
यदि आप किसी सरणी के बजाय वेक्टर का उपयोग करने के साथ ठीक हैं (चूंकि आप आमतौर पर क्लोजर में वैक्टर का उपयोग कर रहे हैं), तो आप कुछ ऐसा कर सकते हैं।
(defn keys-for-truthy-vals [m]
(->> m (filter val) (mapv key)))
नोट mapv
केवल इसलिए है कि मैप कॉल एक वेक्टर लौटाता है। यदि आप seq
चाहते हैं, तो बस map
का उपयोग करें।
अगर आपका नक्शा a
है तो (->> (filter (fn [[k v]] v) a) (map (fn [[k v]] k)))
जैसा कुछ काम करेगा। आप इसे केवल एक मानचित्र के साथ नहीं कर सकते क्योंकि आपको कुछ मूल्यों को छोड़ने की आवश्यकता है, इसलिए कुछ कम करने या फ़िल्टर करने की आवश्यकता होगी।
इसके लिए टुपेलो लाइब्रेरी में बिल्ट-इन फंक्शन है:
(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
फ़ंक्शन का उपयोग कर सकते हैं।
शायद यह?
(->> foo (filter second) keys)
जहां फू एक नक्शा है।
जैसा पहले से ही प्रदान किया गया है, बस नक्शे में रहना।
(कुंजी (फिल्टर वैल एम))