假设我们有一个包含嵌套数据结构的集合:

(def coll
  {:a "aa"
   :b {:d "dd"
       :e {:f {:h "hh"
               :i "ii"}
           :g "gg"}}
   :c "cc"})


我想创建一个函数,该函数在嵌套结构中的任何位置搜索val并返回包含val的键序列

(search-parents "gg" coll) ; or (search-parents coll "gg")
;> [:b :e :g]


谢谢!

最佳答案

据我所知,没有内置函数可以做到这一点。看来您实际上是在寻找clojure.core/get-in的逆数。我认为clojure.walk在这里可能有用,但是我认为这不是一个很好的选择。

但是,编写递归函数进行搜索非常简单,只返回匹配的键:

(defn find-in [coll x]
  (some
    (fn [[k v]]
      (cond (= v x) [k]
            (map? v) (if-let [r (find-in v x)]
                       (into [k] r))))
    coll))

10-04 22:31
查看更多