使用包含一个或多个给定单词集合的值删除集合元素的最惯用方法是什么?

THX*_*137 1 functional-programming clojure clojurescript

假设我想要删除列表中的元素,提到禁止使用的集合中的动物:

(def list (atom [{:animal "a quick happy brown fox that rocks!"}
                 {:animal "a quick happy brown hamster that rocks!"}
                 {:animal "a quick happy brown bird that rocks!"}
                 {:animal "a quick happy brown dog and fox that rock!"}
                 {:animal "a quick happy brown fish that rocks!"}]))

(def banned-from-house (atom ["fox" "bird"]))
Run Code Online (Sandbox Code Playgroud)

最常用的方法是什么?

此外,这个问题的标题会更好吗?(我讨论clojure代码很困难)

Val*_*nck 7

让我们一步一步地构建它.

首先,让我们测试一个String是否提到一些动物名称,使用clojure.string/includes?.

(defn mentions-animal? [s animal]
  (clojure.string/includes? s animal))

(mentions-animal?
  "a quick happy brown fox that rocks!"
  "fox")
=> true
(mentions-animal?
  "a quick happy brown fox that rocks!"
  "dog")
=> false 
Run Code Online (Sandbox Code Playgroud)

其次,让我们测试一个字符串是否提到了一些 seq的动物名称clojure.core/some.

(defn mentions-any? [s animals]
  (some #(mentions-animal? s %) animals))

(mentions-any?
  "a quick happy brown fox that rocks!"
  #{"fox" "dog"})
=> true
(mentions-any?
  "a quick happy brown fox that rocks!"
  #{"cat" "dog"})
=> nil
Run Code Online (Sandbox Code Playgroud)

接下来,将此逻辑扩展到动物贴图而不是字符串.

(defn animal-mentions-any? 
  [a animals]
  (mentions-any? (:animal a) animals))
Run Code Online (Sandbox Code Playgroud)

最后,使用clojure.core/remove以下方法实现过滤逻辑:

(defn remove-banned-animals 
  [animals-list banned-animals]
  (remove #(animal-mentions-any? % banned-animals) animals-list))

(remove-banned-animals
  [{:animal "a quick happy brown fox that rocks!"}
   {:animal "a quick happy brown hamster that rocks!"}
   {:animal "a quick happy brown bird that rocks!"}
   {:animal "a quick happy brown dog and fox that rock!"}
   {:animal "a quick happy brown fish that rocks!"}]
  ["fox" "bird"])
=> ({:animal "a quick happy brown hamster that rocks!"} {:animal "a quick happy brown fish that rocks!"})
Run Code Online (Sandbox Code Playgroud)