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}