2

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

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

谢谢!

4

2 回答 2

4

据我所知,没有内置函数可以做到这一点。似乎您本质上是在寻找 的倒数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))
于 2013-09-11T05:04:54.640 回答
2

我需要扩展它以涵盖地图矢量:

(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))
            (vector? v) (let [v1 (mapv #(find-in % x) v)]
                          (if-let [r (some #(when % %) v1)]
                            (let  [i (.indexOf v1 r)]
                              (into (into [k] [i]) r))
                              ))))
         coll))
于 2019-11-28T13:56:19.640 回答