从地图中删除键和值

Stu*_*art 1 clojure

我有一张看起来像这样的地图:

{\a [\h] 
 \h [\w \w]
 \i [\w \h \t]
 \p [\t \u \h \a]
 \s [\t \a \t \t \i \w \h]
 \t [\a]
 \u [\t \t \s]
 \w []}
Run Code Online (Sandbox Code Playgroud)

我想从键和值中删除例如 \w。即离开这个

{\a [\h] 
 \h []
 \i [\h \t]
 \p [\t \u \h \a]
 \s [\t \a \t \t \i \h]
 \t [\a]
 \u [\t \t \s]}
Run Code Online (Sandbox Code Playgroud)

注意,\w 键已经消失,\w 已经从所有值消失了!

现在我有这个,它有效,但我相信一定有更好的,更多的 Clojurey 方式!

(defn remove-last [last cmap]
  (reduce-kv (fn [acc k v]
               (if (empty? v)
                 acc
                 (into acc {k (vec (filter #(not= % last) v))}))) {} cmap))
Run Code Online (Sandbox Code Playgroud)

要删除的键将始终是一个空向量。

我怎样才能做得更好?

lee*_*ski 8

我的建议是首先从地图中分离 \w 键(考虑到这是〜恒定时间操作),然后使用转换器在一次传递中重塑序列而不会失去声明式风格,并消除reduce的冗长,同时保持性能。看起来像这样:

(into {}
      (map (fn [[k v]] [k (filterv #(not= \w %) v)]))
      (dissoc data \w))
Run Code Online (Sandbox Code Playgroud)

至于我,我认为这比 reduce/assoc 或 reduce/update 更具可读性