Map 从Clojure映射中过滤nil值?

Map 从Clojure映射中过滤nil值?,map,filter,clojure,Map,Filter,Clojure,从Clojure映射中筛选nil值的最佳方法是什么 { :a :x :b nil :c :z } ;;=> { :a :x, :c :z } 或者再短一点: (into {} (keep #(if (val %) %) {:a :x :b nil :c :z})) 事实上,您的筛选建议更好、更短,因此我只想使用: (into {} (filter val {:a :x :b nil :c :z})) 我使用以下代码: (into {} (filter val {:a 1, :b 2

从Clojure映射中筛选
nil
值的最佳方法是什么

{ :a :x :b nil :c :z }
;;=>  { :a :x, :c :z }
或者再短一点:

(into {} (keep #(if (val %) %) {:a :x :b nil :c :z}))
事实上,您的筛选建议更好、更短,因此我只想使用:

(into {} (filter val {:a :x :b nil :c :z}))
我使用以下代码:

(into {} (filter val {:a 1, :b 2, :c nil}))
;;=> {:a 1, :b 2}
注意:这将删除假值以及nils,我将使用:

(into {} (filter (comp some? val) {:a :x, :b nil, :c :z}))

=> {:a :x, :c :z}

显式执行检查非常重要,因为如果您只是执行
(进入{}(filter val{…}))
,那么您将错误地删除布尔值false。

可能不是最佳解决方案,但这里有一个使用列表理解的解决方案:

(into {} 
  (for [[k v] {:a 1 :b nil :c :z} :when (not (nil? v))]
    [k v]))

实现这一点的最好方法实际上是
(进入{}(保持第二个{:a:x:bnil}))

您的函数返回(:x:z),而不是{:a:x:c:z}或者
(进入{}(删除(comp nil?val){:a:x:bnil:c:z}))
是的,删除版本是等效的。事实上,remove实际上是使用filter在Clojure源代码中实现的,如:
(filter(complete pred)coll)
。带筛选器的版本稍微快一点,带remove的版本稍微短一点,键入:-)那么嵌套的nil值呢?这也会筛选出false out:(比你可以使用mikera描述的方法还要多。但是在大多数情况下,我们的逻辑是nil意味着false,vv(保持第二个{:a:x:b nil}=>(:x),
进入
抛出异常。
(into {} 
  (for [[k v] {:a 1 :b nil :c :z} :when (not (nil? v))]
    [k v]))