将具有默认值的键添加到嵌套的clojure hashmap

1 recursion clojure hashmap clojurescript

我试图做Clojure但坚持使用嵌套的hashmap.我有这样的结构:

{:type "view" 
 children: [
     {:type "view" 
      :id "123"} 
     {:type "view" 
      :children [
         {:type "view"}]}]}
Run Code Online (Sandbox Code Playgroud)

现在我想:id用随机字符串向每个hashmap 添加字段(如果不存在).得到这样的东西:

{:type "view" 
 :id "43434"
 children: [
     {:type "view" 
      :id "123"} 
     {:type "view" 
      :id "456"
      :children [
         {:type "view"
          :id "5656"}]}]}
Run Code Online (Sandbox Code Playgroud)

Tay*_*ood 8

你可以clojure.walk/postwalk这样做:

 (walk/postwalk
  (fn [v]
    (if (and (map? v) (nil? (:id v)))
      (assoc v :id (str (rand-int 9999)))
      v))
   data)
=>
{:type "view"
 :id "3086"
 :children [{:type "view"
             :id "123"}
            {:type "view"
             :id "8243"
             :children [{:type "view" :id "3222"}]}]}
Run Code Online (Sandbox Code Playgroud)

... data输入地图在哪里?postwalk遍历您的嵌套映射,并在没有一个映射的每个映射上assoc处理一个:id键(一个随机整数字符串).