Map 从Clojure映射中过滤nil值?
从Clojure映射中筛选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
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]))