如何在深度嵌套的数据结构中查找元素?
How to find an element in deeply nested data structure?
我有这个结构(这是解析 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 and children
.
的映射
我正在尝试查找其 b
属性 的值为 9
的节点。
所以,查找的结果是:
我尝试遍历结构 tree-seq
:
(tree-seq #(not-empty? % "children") identity structure)
但实际上我得到的是相同的结构。我期望得到一系列节点,其中关系被展平,然后我可以过滤序列。
如何以惯用的方式(并希望表现出色)做到这一点?随意用拉链或走路来打动我。
您可以像这样获得所需的树序列:
(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" []}
(def data
[{"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" []}]}])
branch?
fn 将在第一次迭代时接收整个向量作为参数,所以我使用了 vector?
谓词,但这是不必要的,因为我们可以用简单的 not-empty
函数简化它对于矢量和地图都可以很好地工作。
(tree-seq
not-empty
#(if (vector? %) % (% "children"))
data)
我有这个结构(这是解析 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 and children
.
我正在尝试查找其 b
属性 的值为 9
的节点。
所以,查找的结果是:
我尝试遍历结构 tree-seq
:
(tree-seq #(not-empty? % "children") identity structure)
但实际上我得到的是相同的结构。我期望得到一系列节点,其中关系被展平,然后我可以过滤序列。
如何以惯用的方式(并希望表现出色)做到这一点?随意用拉链或走路来打动我。
您可以像这样获得所需的树序列:
(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" []}
(def data
[{"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" []}]}])
branch?
fn 将在第一次迭代时接收整个向量作为参数,所以我使用了 vector?
谓词,但这是不必要的,因为我们可以用简单的 not-empty
函数简化它对于矢量和地图都可以很好地工作。
(tree-seq
not-empty
#(if (vector? %) % (% "children"))
data)