1

我想要一个从包含该节点的集合中删除任何节点(子集合)的函数。

(def coll {:a ["b" {:c "d" :e ["f" {:g "h"}]}]})
(def node {:g "h"})

什么是好的删除节点功能?

(remove-node coll node)
;=> {:a ["b" {:c "d" :e ["f"]}]})

谢谢!

编辑:我想要做的是删除一个活跃节点

(def enlive-node
  [{:type :dtd, :data ["html" nil nil]} 
   {:tag :html, 
    :attrs nil, 
    :content ["\n" 
              {:tag :head, 
               :attrs nil, 
               :content ["\n    \n    " 
                         {:tag :title, 
                          :attrs nil, 
                          :content ["Stack Overflow"]} 
                         "\n    " 
                         {:tag :link, 
                          :attrs {:href "//cdn.sstatic.net/stackoverflow/img/favicon.ico", 
                                  :rel "shortcut icon"}, 
                                  :content nil}]}]}])

要删除的节点始终是一个字符串或整个哈希映射。

(remove-node enlive-node {:tag :title, 
                              :attrs nil, 
                              :content ["Stack Overflow"]})
4

1 回答 1

3

对于您拥有的示例,您可以使用clojure.walk/postwalk遍历哈希图并删除节点。

(require '[clojure.walk :as walk])

(defn remove-node [coll target]
  (walk/postwalk
    (fn [item]
      (if (vector? item)
        (filterv #(not= target %) item)
        item))
    coll))

(remove-node coll node)

编辑:

从您更新的问题来看,您似乎正在对 Enlive 节点集合进行操作。在您的情况下,另一个解决方案是生成一个 Enlive 节点选择器并使用该net.cgrand.enlive-html/at*函数转换集合。

(require '[net.cgrand.enlive-html :as e])

(defn gen-transform [target]
  [[(cond
     (string? target) e/text-node
     (map? target) (:tag target)
     :else e/any-node)]
   #(when (not= target %) %)])

(defn remove-node [coll & nodes]
  (e/at* coll (map gen-transform nodes)))

(remove-node enlive-node
             {:tag :title, :attrs nil, :content ["Stack Overflow"]}
             "\n")
于 2013-09-18T02:30:37.397 回答