【问题标题】:how to remove a given key from a series of maps in a vector in clojure?如何从clojure中向量中的一系列映射中删除给定的键?
【发布时间】:2019-12-02 21:50:15
【问题描述】:

在 clojure 中,给定一个数据结构 [{:a "foo" :b "bar"} {:a "biz" :b "baz"}] 我如何最简洁地得到 [{:b "bar"}{:b "baz"}]

【问题讨论】:

    标签: clojure lisp clojurescript


    【解决方案1】:

    dissoc 是一个用于将键与映射等关联结构分离的函数。以下是使用一张地图的方法:

    (dissoc my-map :a)
    

    如果您有一系列映射,您可以通过 map 对它们执行一个函数,以 dissoc 每个映射的键:

    (map #(dissoc % :a) the-maps)
    

    此措辞将anonymous function 传递给map,但根据使用情况,您可能希望提取命名函数:

    (defn fix-the-map [m]
      (dissoc m :a))
    
    (map fix-the-map the-maps)
    

    【讨论】:

    • 您可能还希望使用mapv 而不是map,因为它总是以 Clojure 向量而不是惰性序列形式为您提供结果。
    • 我认为有些人太渴望得到矢量结果。我不喜欢无缘无故地放弃懒惰。
    • 就风格而言,虽然 map 非常适合命名函​​数,而不是 (map #(...) xs) 我个人更喜欢写一个列表推导式。所以,(for [m the-maps] (dissoc m :a)).
    【解决方案2】:

    @Taylor 在每个地图中对dissoc:a 的上述回答都可以,如果您希望所有地图都没有:a

    如果你想要一个只有:b 键的地图列表,你可以这样做

    <!-- language-all: lang-clj -->
    
    ;; Assuming my-map is the object map
    ;; map returns a lazy sequence
    
    (map #(hash-map :b (:b %)) my-map)
    
    ;; or
    (map #(select-keys % [:b]) mp)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      相关资源
      最近更新 更多