从Clojure地图过滤零值?

时间:2012-02-18 08:59:56

标签: map filter clojure

从Clojure地图nil过滤{}值的最佳方法是什么?

{ :a :x :b nil :c :z }
;;=>  { :a :x, :c :z }

5 个答案:

答案 0 :(得分:36)

我会用:

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

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

显式执行some?检查非常重要,因为如果你只是执行(into {} (filter val {...})),那么你将错误地删除布尔值为false的值。

答案 1 :(得分:5)

我使用以下代码:

(into {} (filter val {:a 1, :b 2, :c nil}))
;;=> {:a 1, :b 2}

注意:这将删除错误值以及nils

答案 2 :(得分:3)

可能不是最好的解决方案,但这是使用列表理解的方法:

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

答案 3 :(得分:0)

(into {} (keep (fn [e] (if (val e) e)) {: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}))

答案 4 :(得分:-3)

最好的方法实际上是(into {} (keep second {:a :x :b nil}))