Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 如何从地图中删除多个关键点?_Clojure - Fatal编程技术网

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])