繁体   English   中英

Clojure-如果value为true,则创建一个键数组

[英]Clojure - Create an array of keys if value is true

我对Clojure完全陌生。

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

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

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

也有一些简短的摘要:

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

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

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

注意 mapv仅是这样,因此map调用返回一个向量。 如果需要seq ,只需使用map

如果您的地图是a喜欢的东西(->> (filter (fn [[kv]] v) a) (map (fn [[kv]] k)))会工作。 您不能仅使用地图来完成此操作,因为您需要删除某些值,因此需要进行一些缩小或过滤。

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功能。

也许这个吗?

(->> foo (filter second) keys)

foo是一张地图。

与已经提供的相同,只是停留在地图上。

(键(过滤器val m))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM