【问题标题】:In clojure, how to find all the maps in a nested map that have some key在clojure中,如何在嵌套映射中找到所有具有某些键的映射
【发布时间】:2015-02-23 07:08:16
【问题描述】:

m 成为一个嵌套映射。 如何在m 中找到所有具有某个键的地图。

例如:

(def m {:a {:id 5}
        :d {:id 58}
        :x {:id 4 :c {:id 3 :d 4}}})

(recursive-filter m :id)

;; expected result: 
> ({:id 5} {:id 58} {:id 4 :c {:id 3 :d 4}} {:id 3})

【问题讨论】:

    标签: dictionary filter clojure


    【解决方案1】:

    您可以使用以下内容:

    (def data {:a {:id 5}
               :d {:id 58}
               :x {:id 4 :c {:id 3 :d 4}}})
    
    (defn recursive-filter [m f]
      (filter #(and (map? %) (f %))
              (tree-seq map? vals m)))
    
    (recursive-filter data :id)
    

    【讨论】:

    • +1:善用tree-seq。 +1:f 可以是在地图上执行测试的任何函数,而不仅仅是关键字。凉爽的! -1:不适用于不可调用的键。 -1:如果键映射到值falsenil,则不起作用。净 = 0
    • @AlexD 如果需要使用不是关键字(例如true)的键,则可以使用以下(recursive-filter data #(get % true))
    • 让我收回“Net = 0”...这绝对值得+1。
    • 请注意,如果密钥映射到falsenil#(get % true) 仍然不起作用。
    • @AlexD 在这些场景中,例如可以使用(recursive-filter data #(contains? % nil))
    【解决方案2】:

    灵感来自@Symfrog:

    (defn recursive-filter [m k]
      (filter #(and (map? %) (contains? % k)) (tree-seq map? vals m)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 2017-05-27
      • 2014-04-30
      相关资源
      最近更新 更多