Clojure中的嵌套映射转换为嵌套向量

6

我想知道在Clojure中将嵌套的map转换为嵌套的vector的最常用方式。

例如:

{:left {:left {:left 1, :right 5, :middle 1, :score 10}, :right {:left 7, :right 8, :middle 7, :score 0}, :middle 5, :score 10}, :right 9, :middle 8, :score 10}

to:

[ [ [ 1,  5, 1, 10 ],  [ 7, 8, 7, 0], 5, 10], 9, 8, 10]

非常感谢


我很好奇这个的用途是什么。请告诉我。 - deadghost
我使用映射实现了一个优先搜索树,我想使用vijual库来可视化这个嵌套的映射树结构(它可以打印出漂亮的ASCII树形表示),但是vijuals只接受嵌套向量。 - user1782011
2个回答

7
您可以使用clojure.walk/postwalk函数以后序遍历(即从叶节点开始)Clojure数据结构,并将其中的映射替换为包含[:left :right :middle :score]值的向量。请注意保留HTML标记。
(require '[clojure.walk :refer [postwalk]])

(def nested-map 
  {:left {:left {:left 1, :right 5, :middle 1, :score 10}, 
          :right {:left 7, :right 8, :middle 7, :score 0}, 
          :middle 5, 
          :score 10}, 
   :right 9, 
   :middle 8, 
   :score 10})

(postwalk
  (fn [v]
    (if (map? v)
      ((juxt :left :right :middle :score) v)
      v))
  nested-map)
;; => [[[1 5 1 10] [7 8 7 0] 5 10] 9 8 10]

5

My shot at it:

(clojure.walk/postwalk #(if (map? %) (into [] (vals %)) %) nested-map)
=> [[5 10 [7 0 8 7] [1 10 5 1]] 8 9 10]

在使用哈希图时,它不会保留顺序; 但是,当使用数组图时,它将保留顺序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接