clojure - 使用 clojure,有没有更好的方法从序列中删除项目,这是 map 中的值?

有一个包含序列的 map 。序列包含项目。 我想从包含它的任何序列中删除给定的项目。

我找到的解决方案做了它应该做的,但我想知道是否有更好的 或更优雅的方式来实现同样的目标。

我目前的解决方案:

(defn remove-item-from-map-value [my-map item]
    (apply merge (for [[k v] my-map] {k (remove #(= item %) v)})))

测试描述了预期的行为:

(require '[clojure.test :as t])

(def my-map {:keyOne   ["itemOne"]
             :keyTwo   ["itemTwo" "itemThree"]
             :keyThree ["itemFour" "itemFive" "itemSix"]})

(defn remove-item-from-map-value [my-map item]
  (apply merge (for [[k v] my-map] {k (remove #(= item %) v)})))

(t/is (= (remove-item-from-map-value my-map "unknown-item") my-map))
(t/is (= (remove-item-from-map-value my-map "itemFive") {:keyOne   ["itemOne"]
                                                         :keyTwo   ["itemTwo" "itemThree"]
                                                         :keyThree ["itemFour" "itemSix"]}))

(t/is (= (remove-item-from-map-value my-map "itemThree") {:keyOne   ["itemOne"]
                                                          :keyTwo   ["itemTwo"]
                                                          :keyThree ["itemFour" "itemFive" "itemSix"]}))

(t/is (= (remove-item-from-map-value my-map "itemOne") {:keyOne   []
                                                        :keyTwo   ["itemTwo" "itemThree"]
                                                        :keyThree ["itemFour" "itemFive" "itemSix"]}))

我是 clojure 的新手,对不同的解决方案很感兴趣。 所以欢迎任何意见。

最佳答案

我投入 specter 版本的好措施。它将矢量保存在 map 内 而且它非常紧凑。

(setval [MAP-VALS ALL #{"itemFive"}] NONE my-map)

例子

user=> (use 'com.rpl.specter)
nil
user=> (def my-map {:keyOne   ["itemOne"]
  #_=>              :keyTwo   ["itemTwo" "itemThree"]
  #_=>              :keyThree ["itemFour" "itemFive" "itemSix"]})
  #_=> 
#'user/my-map
user=> (setval [MAP-VALS ALL #{"itemFive"}] NONE my-map)
{:keyOne ["itemOne"],
 :keyThree ["itemFour" "itemSix"],
 :keyTwo ["itemTwo" "itemThree"]}
user=> (setval [MAP-VALS ALL #{"unknown"}] NONE my-map)
{:keyOne ["itemOne"],
 :keyThree ["itemFour" "itemFive" "itemSix"],
 :keyTwo ["itemTwo" "itemThree"]}

https://stackoverflow.com/questions/67295137/

相关文章:

http - 使用 Clack/ningle 在 Web 服务器中嵌入图像

python - PyCharm 看不到项目中的文件

matlab - 如何使用 matlab 正确绘制矢量线性方程?

flutter - 为什么 SliverFillRemaining 膨胀得太多了?

r - 将字符串拆分为单词并分配给新列

svg - 如何配置在 sveltekit 中使用 svg 文件?

c++ - 使用具有非 constexpr 值的 int 模板函数

python - 将带有项目列表的字典转换为 Pandas 数据框

powerbi - Multi-Tenancy 场景下如何访问power BI Service

java - 在流中按条件抛出异常