我有一张看起来像这样的地图:
var data = dataRange.getDisplayValues();// Fetch values for each row in the range
我想删除例如\ w来自键和值。即离开
{\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 []}
注意,\ w键已消失,\ w已从所有值消失!
现在我有了它,它可以工作,但是我敢肯定必须有一种更好,更克洛瑞(Clojurey)的方式!
{\a [\h]
\h []
\i [\h \t]
\p [\t \u \h \a]
\s [\t \a \t \t \i \h]
\t [\a]
\u [\t \t \s]}
要删除的键始终是空向量。
我该怎么做呢?
答案 0 :(得分:8)
我的建议是,首先从地图上分离\ w键(考虑这是〜恒定时间操作),然后使用换能器在一次传递中重塑序列,而不会丢失声明式样式,并消除减少冗长,同时保持性能。可能看起来像这样:
(into {}
(map (fn [[k v]] [k (filterv #(not= \w %) v)]))
(dissoc data \w))
对我来说,我认为这比reduce / associ或reduce / update更具可读性
答案 1 :(得分:4)
我非常喜欢幽灵:
(s/setval (s/walker (fn-> (= \w))) s/NONE {\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 []})
答案 2 :(得分:2)
我发现您的解决方案很惯用。这个要求非常不寻常,我立即想到reduce
。不过,您打给empty?
的电话与您的规范不符。您必须测试密钥k
是=
到last
的关键所在。
此外,在这里我不会使用名称last
。它与已经存在的名称发生冲突。
一个非常相似的选择是
(defn remove-all-of [it m]
(reduce
(fn [acc [k v]]
(if (not= it k)
(assoc acc
k
(into (empty v)
(filter #(not= it %) v)))
acc))
{}
m))
通过使用(empty v)
,这还使您可以将向量以外的其他可序列化对象作为值。