我对Clojure完全陌生。
我有一个类似{ "1": true, "2": false, "3": true, "4": false }
我想创建一个键数组,其值在clojure中为true。在此示例中,数组应为["1", "3"]
。
请帮助我。任何帮助将不胜感激。
答案 0 :(得分:8)
还有一些简短的摘要:
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")
答案 1 :(得分:3)
如果您可以使用向量而不是数组(因为无论如何通常都在Clojure中使用向量),则可以执行类似的操作。
(defn keys-for-truthy-vals [m]
(->> m (filter val) (mapv key)))
注意 mapv
仅用于地图调用返回一个向量。如果您想要seq
,只需使用map
。
答案 2 :(得分:0)
如果您的地图是import kotlinx.android.synthetic.main.layout1.myTextView as myTextView1
import kotlinx.android.synthetic.main.layout2.myTextView as myTextView2
,则类似a
的东西将起作用。您不能仅使用地图来完成此操作,因为您需要删除某些值,因此需要进行一些缩小或过滤。
答案 3 :(得分:0)
为此内置了功能in the Tupelo library:
(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
函数。
答案 4 :(得分:0)
也许是吗?
(->> foo (filter second) keys)
其中foo是地图。
答案 5 :(得分:0)
与已经提供的相同,只是停留在地图上。
(键(过滤器val m))