Clojure 如何从地图中删除多个关键点?
我有一个从地图中删除关键点的函数:Clojure 如何从地图中删除多个关键点?,clojure,Clojure,我有一个从地图中删除关键点的函数: (defn remove-key [key map] (into {} (remove (fn [[k v]] (#{key} k)) map))) (remove-key :foo {:foo 1 :bar 2 :baz 3}) 如何使用多个键应用此功能 (remove-keys [:foo :bar] {:foo 1 :bar 2 :baz 3}) 我有一个使用循环…重现的实现。在Clojure中有
(defn remove-key [key map]
(into {}
(remove (fn [[k v]] (#{key} k))
map)))
(remove-key :foo {:foo 1 :bar 2 :baz 3})
如何使用多个键应用此功能
(remove-keys [:foo :bar] {:foo 1 :bar 2 :baz 3})
我有一个使用循环…重现的实现。在Clojure中有没有更惯用的方法
(defn remove-keys [keys map]
(loop [keys keys
map map]
(if (empty? keys)
map
(recur (rest keys) (remove-key (first keys) map)))))
从贴图中删除一个或多个关键点:
(dissoc {:foo 1 :bar 2 :baz 3} :foo :bar)
或者,如果您在集合中有密钥
(apply dissoc {:foo 1 :bar 2 :baz 3} [:foo :bar])
标准库函数
dissoc
涵盖了您的remove key
功能dissoc
将一次删除多个键,但它希望这些键直接在参数列表中给出,而不是在列表中给出。因此,您可以使用apply
将其“展平”
正如其他人所说,使用内置函数而不是编写自己的函数 但是,如果这只是一个示例,并且您想知道在没有标准dissoc的情况下如何执行此操作,那么您可以使用:
(reduce (fn [m k] (remove-key k m)) {:foo 1 :bar 2 :baz 3} [:foo :bar])
显然,如果您还原参数以删除密钥,那么编写起来会简单得多:
(reduce remove-key {:foo 1 :bar 2 :baz 3} [:foo :bar])
在clojure中,我发现这种类型的东西和其他类型的东西非常烦人,所以为了修复它,我创建了库instar: Clojure难道没有办法在函数调用中“分解”向量吗?ala Python的
*列表
?@john2x,应用
正是这样做的。也就是说,(apply f foo-bar-baz)
相当于python中的f(foo-bar*baz)
。我做了以下操作(键的字符串):(dissoc映射“foo”“bar”)
(reduce remove-key {:foo 1 :bar 2 :baz 3} [:foo :bar])