1

我想要一种机制来遍历任意嵌套的数据结构。然后在每个节点上应用 fn,然后检查 fn 在每个点是否返回 true。

使用扁平结构很容易做到这一点 -

(walk (complement string?) #(every? true? %) [ 1 2 3 4])

但是 walk 不适用于嵌套的 -

(walk (complement string?) #(every? true? %) [ 1 2 3 [ "a" ]])

仅使用 flatten 也行不通,因为我将地图作为其中一种形式,并且我也希望将 fn 应用于地图中的每个值。这是我将拥有的结构 -

[ ["2012" [{:a 2} {:b 3}]] ["2013" [{:a 2} {:b 3}]] ]

我可以轻松地编写一个 fn 来仅遍历上述内容并将 fn 应用于每个 val。但是有没有办法编写一个通用的遍历机制?

4

1 回答 1

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
于 2013-04-09T15:42:01.223 回答