我想要一种机制来遍历任意嵌套的数据结构。然后在每个节点上应用fn,然后检查fn是否在每个点返回true。
使用扁平结构很容易做到这一点 -
(walk (complement string?) #(every? true? %) [ 1 2 3 4])
然而,步行不适用于嵌套的 -
(walk (complement string?) #(every? true? %) [ 1 2 3 [ "a" ]])
仅使用flatten也不会工作,因为我将地图作为其中一种形式,我也希望fn应用于地图中的每个值。这是我将拥有的结构 -
[ ["2012" [{:a 2} {:b 3}]] ["2013" [{:a 2} {:b 3}]] ]
我可以轻松编写一个fn来仅遍历上面的内容并将fn应用于每个val。但是有没有办法为遍历编写通用机制?
答案 0 :(得分:3)
tree-seq可能就是你想要的
(every? (complement string?)
(remove coll?
(tree-seq coll? #(if (map? %)
(vals %)
%)
[["2012" [{:a 2} {:b 3}]] ["2013" [{:a 2} {:b 3}]]])))
;; false
(every? (complement string?)
(remove coll?
(tree-seq coll? #(if (map? %)
(vals %)
%)
[[2012 [{:a 2} {:b 3}]] [2013 [{:a 2} {:b 3}]]])))
;; true