与pred一起解散

时间:2013-03-26 04:53:45

标签: clojure

(dissoc :a m)允许我解开给定的密钥。但是有没有办法使用谓词函数来解释pred为真的任何键? (dissoc-with-pred pred? m)

因此,给定地图 - {:a 2 :b 3 :c 1 :d 4} (dissoc-with-pred (fn [[kv]] (> v 2) m)将返回{:a 2 :c 1}

1 个答案:

答案 0 :(得分:3)

版本1

(defn dissoc-with-pred [f m]
  (reduce-kv (fn [res k v] 
               (if (f k v) 
                 (assoc res k v)
                 res))
             {} m))

修改。

第2版(由Chouser建议)

(defn dissoc-with-pred [f m]
  (reduce-kv (fn [m k v]
               (if (f k v)
                 m
                 (dissoc m k)))
             m m))

第3版

(defn dissoc-with-pred [f m]
  (into {} (filter (fn [[k v]] (f k v)) m)))

测试

(dissoc-with-pred (fn [k v] (> v 2)) {:a 2 :b 3 :c 1 :d 4})
=> {:b 3, :d 4}