clojure - 如何在深度嵌套的数据结构中查找元素?

标签 clojure tree-traversal

我有这个结构(它是解析 JSON 响应的结果):

 [{"a" {"b" 1 "c" 2} 
       "children" [{"a" {"b" 3 "c" 4} "children" []}]}
  {"a" {"b" 5 "c" 6} "children" []}
  {"a" {"b" 7 "c" 8}
        "children" [{"a" {"b" 9 "c" 10} "children" []}]}]

所以它是一棵树。 children 是节点向量。每个节点都是一个包含a、b 和子节点的映射。

我正在尝试查找其 b 属性值为 9 的节点。 所以,查找的结果是:

我尝试使用tree-seq遍历结构:

(tree-seq #(not-empty? % "children") identity structure)

但实际上我得到了相同的结构。我期望获得一系列节点,其中关系被展平,然后我可以对该序列进行过滤。

如何以惯用的方式做到这一点(并且希望是高性能的)?随意用 zipper 或步行让我大吃一惊。

最佳答案

您可以像这样获得所需的树序列:

(def ts (mapcat (partial tree-seq #(contains? % "children") 
                                  #(get % "children"))
                your-data-structure))

mapcat 是必需的,因为您的输入数据结构包含多个根节点。

E. G。找到一个像这样的节点:

(first (filter #(= (get-in % ["a" "b"]) 9) ts))
;-> {"a" {"b" 9, "c" 10}, "children" []}

关于clojure - 如何在深度嵌套的数据结构中查找元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32103459/

相关文章:

algorithm - 具有空元素的中序、先序和后序遍历的唯一性

python - 让函数的唯一目的是调用另一个函数是个好主意吗?

algorithm - 惯用遍历二叉树(可能是任何树)

emacs - 'swank-clojure' 究竟做了什么,我们有 'swank-SOMETHING_ELSE' 吗?

macros - Clojure 科尔马 : Cannot run an aggregate count

function - 如何在 Clojure 中从字符串定义函数?

sql - Clojure 和 HugSQL;如何提供SQL关键字?

algorithm - 使用标签重新排列树

c - 前序树遍历有效但后序无效

Clojure join 无法根据过滤函数的结果创建字符串