假设我有一个m类似的地图{"good1" 1, "bad1" 1, "good2" 2, "bad2" 2},并且我想根据地图键上的某些谓词删除条目,一种方法是:
(defn dissoc-by [f m] (->> m (filter (complement f)) (into {})))
(dissoc-by #(.contains (first %1) "bad") m)
=> {"good1" 1, "good2" 2}
Run Code Online (Sandbox Code Playgroud)
在clojure中有更多惯用的方法吗?
特定
(def data {"good1" 1, "bad1" 1, "good2" 2, "bad2" 2})
Run Code Online (Sandbox Code Playgroud)
限定
(defn remove-keys [pred m]
(apply dissoc m (filter pred (keys m))))
Run Code Online (Sandbox Code Playgroud)
然后
(remove-keys #(string/includes? % "bad") data)
=> {"good1" 1, "good2" 2}
Run Code Online (Sandbox Code Playgroud)
类似的功能在Clojure Cookbook中定义.
这是一种非常正常的处理方式,需要进行一个更正,即映射中的序列是一系列对 [键值] 而不仅仅是键,因此您的过滤函数需要显式使用键
user> (defn dissoc-by [f m] (->> m (filter #(f (first %))) (into {})))
#'user/dissoc-by
user> (dissoc-by #(.contains % "good") m)
{"good1" 1, "good2" 2}
Run Code Online (Sandbox Code Playgroud)
如果您想了解它并使用传感器,可以通过消除分配用于将数据从一个步骤移动到下一步的中间序列来使该功能更加高效。
user> (defn dissoc-by [f m]
(into {} (filter #(f (first %))) m))
#'user/dissoc-by
user> (dissoc-by #(.contains % "good") m)
{"good1" 1, "good2" 2}
Run Code Online (Sandbox Code Playgroud)
into采用可选的中间参数,即转换器函数,可以在数据深入到集合中时过滤或转换数据。