如何遍历/遍历任意嵌入式结构

时间:2013-04-09 10:37:07

标签: clojure

我想要一种机制来遍历任意嵌套的数据结构。然后在每个节点上应用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。但是有没有办法为遍历编写通用机制?

1 个答案:

答案 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