Clojure - 如果值为真,则创建一个键数组

Clojure - Create an array of keys if value is true

我是 clojure 的新手。

我有一个 JSON 像:{ "1": true, "2": false, "3": true, "4": false }

我想创建一个在 clojure 中值为 true 的键数组。在此示例中,数组应为 ["1", "3"].

请帮帮我。任何帮助将不胜感激。

如果您的地图是 a,则 (->> (filter (fn [[k v]] v) a) (map (fn [[k v]] k))) 之类的地图会起作用。你不能只用一张地图来做,因为你需要删除某些值,所以需要一些减少或过滤。

如果您愿意使用向量而不是数组(因为无论如何您通常在 Clojure 中使用向量),您可以执行类似的操作。

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

注意 mapv 只是地图调用 returns 一个向量。如果您想要 seq,只需使用 map

还有几个简短的片段:

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")

内置函数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 函数。

也许是这个?

(->> foo (filter second) keys)

其中 foo 是一张地图。

和已经提供的一样,只是停留在地图上。

(keys (filter val m))