我有一张看起来像这样的地图:
{\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)
要删除的键将始终是一个空向量。
我怎样才能做得更好?
我的建议是首先从地图中分离 \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 更具可读性
归档时间: |
|
查看次数: |
155 次 |
最近记录: |