假设我们有一个包含嵌套数据结构的集合:
(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]
谢谢!
答案 0 :(得分: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))
答案 1 :(得分: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))