从地图中删除键和值

时间:2020-01-29 20:22:54

标签: clojure

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

  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]}

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

我该怎么做呢?

3 个答案:

答案 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),这还使您可以将向量以外的其他可序列化对象作为值。