Clojure 与pred的dissoc

Clojure 与pred的dissoc,clojure,Clojure,(dissoc:a m)允许我解除对给定密钥的锁定。但是,有没有一种方法可以使用谓词函数分解pred为true的任何键(与pred pred?m分离) 因此,给定一个映射-{:a2:b3:c1:d4}(带pred(fn[[kv]](>v2)m的dissoc)将返回{:a2:c1}版本1 (defn dissoc-with-pred [f m] (reduce-kv (fn [res k v] (if (f k v) (ass

(dissoc:a m)
允许我解除对给定密钥的锁定。但是,有没有一种方法可以使用谓词函数分解pred为true的任何键<代码>(与pred pred?m分离)

因此,给定一个映射-
{:a2:b3:c1:d4}
(带pred(fn[[kv]](>v2)m的dissoc)
将返回
{:a2:c1}
版本1

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

版本2(用户建议)

版本3

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


你赢了我!我在想一个类似的计划solution@murtaza52我希望答案是有帮助的。这两个都是从一个新的空映射开始的。虽然这通常很好,但这确实意味着您可能会丢失元数据或输入映射的记录类型。实际上,在内部使用
dissoc
可以解决这一问题:
(defn dissoc with pred[f m](减少千伏(fn[mk v](如果(f k v)m(dissoc m k)))m))
(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}