在 Clojure 中,如何找到可能位于嵌套映射结构深处的键的值?例如:
(def m {:a {:b "b"
:c "c"
:d {:e "e"
:f "f"}}})
(find-nested m :f)
=> "f"
最佳答案
Clojure 提供 tree-seq
对任何值进行深度优先遍历。这将简化查找嵌套键所需的逻辑:
(defn find-nested
[m k]
(->> (tree-seq map? vals m)
(filter map?)
(some k)))
(find-nested {:a {:b {:c 1}, :d 2}} :c)
;; => 1
此外,找到所有匹配项成为替换
some
的问题。与 keep
:(defn find-all-nested
[m k]
(->> (tree-seq map? vals m)
(filter map?)
(keep k)))
(find-all-nested {:a {:b {:c 1}, :c 2}} :c)
;; => [2 1]
请注意,使用
nil
映射值可能需要一些特殊处理。更新:如果你看上面的代码,你可以看到
k
实际上可以是一个提供更多可能性的函数:(find-nested m #(get % "k"))
(find-nested m #(some % [:a :b]))
(find-nested m #(when (some-> % :k pos?) (:k %)))
关于clojure - 在嵌套映射中查找特定键的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28091305/