簡體   English   中英

Clojure - 遞歸展平嵌套地圖

[英]Clojure - Recursively Flatten Nested Maps

給定一個帶有鍵的映射:content,其中content是字符串列表或其他映射,如何將值展平以僅接收字符串?

(flattener {:content '("b" {:content ("c" {:content ("d")})} "e")})

> '("b" "c" "d" "e")

我正在磕磕絆絆地進行非常粗暴的循環重復嘗試,現在我的大腦被燒毀了。 在Clojure中有一個很好的慣用方法嗎?

謝謝。

我得到的是下面的,雖然它有效,但它很難看

(defn flatten-content
  [coll]
  (loop [acc '(), l coll]
    (let [fst (first l), rst (rest l)]
      (cond
       (empty? l) (reverse acc)
       (seq? fst) (recur acc (concat fst rst))
       (associative? fst) (recur acc (concat (:content fst) rst))
       :else (recur (conj acc fst) rst)))))

tree-seq函數可以幫助您行走,也可以自動映射

(def m {:content '("b" {:content ("c" {:content ("d")})} "e")})

總是有一個“孩子”的列表鍵入:content ,這是有效的

(filter string? (tree-seq associative? :content m))
;=> ("b" "c" "d" "e")

以下遞歸函數有效(並且比filter ed tree-seq方法快25%):

(defn flatten-content [node]
  (lazy-seq
    (if (string? node)
      (list node)
      (mapcat flatten-content (:content node)))))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM