Data structures Clojure地图汇总

Data structures Clojure地图汇总,data-structures,clojure,Data Structures,Clojure,我的数据结构与 [{:Gender "Boy" :Cat1 "Foo" :Cat2 "Bar" :SKU 111} {:Gender "Boy" :Cat1 "Foo" :Cat2 "Bar" :SKU 222} {:Gender "Girl" :Cat1 "Foo" :Cat2 "Bar" :SKU 333} {:Gender "Boy" :Cat1 "Foo" :Cat2 "Woo" :SKU 444}] 我想建立一个数据结构,看起来像 [{:Name "Boy"

我的数据结构与

[{:Gender "Boy" :Cat1 "Foo" :Cat2 "Bar" :SKU 111}
 {:Gender "Boy"  :Cat1 "Foo" :Cat2 "Bar" :SKU 222}
 {:Gender "Girl" :Cat1 "Foo" :Cat2 "Bar" :SKU 333}
 {:Gender "Boy" :Cat1 "Foo" :Cat2 "Woo" :SKU 444}]
我想建立一个数据结构,看起来像

   [{:Name "Boy" 
      :Children
       { :Name "Foo"
         :Children
          {:Name "Bar"
           :Children
             {:SKU 111}
             {:SKU 222}
          }
          {:Name "Woo"
           :Children
             {:SKU 444}
          }
      }
    {:Name "Girl"
      :Children
       {:Name "Foo"
        :Children
         {:Name "Bar"
          :Children
            {:SKU 333}
         }
        }            
       }]          

我是Clojure的新手,所以如果答案显而易见,请原谅

不完全是你想要的,但可能很接近:

user=> (def foo  [{:Gender "Boy" :Cat1 "Foo" :Cat2 "Bar" :SKU 111}
  #_=>      {:Gender "Boy"  :Cat1 "Foo" :Cat2 "Bar" :SKU 222}
  #_=>      {:Gender "Girl" :Cat1 "Foo" :Cat2 "Bar" :SKU 333}
  #_=>      {:Gender "Boy" :Cat1 "Foo" :Cat2 "Woo" :SKU 444}])
#'user/foo

user=> (group-by (juxt :Gender :Cat1 :Cat2) foo)
    {["Boy" "Foo" "Bar"] [{:Gender "Boy", :Cat2 "Bar", :Cat1 "Foo", :SKU 111} 
     {:Gender "Boy", :Cat2 "Bar", :Cat1 "Foo", :SKU 222}], 
     ["Girl" "Foo" "Bar"] [{:Gender "Girl", :Cat2 "Bar", :Cat1 "Foo", :SKU 333}], 
     ["Boy" "Foo" "Woo"] [{:Gender "Boy", :Cat2 "Woo", :Cat1 "Foo", :SKU 444}]}

user=> (def foo2 (group-by (juxt :Gender :Cat1 :Cat2) foo))
#'user/foo2

user=>  (zipmap (keys foo2) (map #(map :SKU %) (vals foo2)))
{["Boy" "Foo" "Woo"] (444), ["Girl" "Foo" "Bar"] (333), ["Boy" "Foo" "Bar"] (111 222)}
下面是解决方案(注意:
:Children
应该是地图列表)


因为地图缺少一个定义的顺序,使用一个成对的列表而不是一个地图列表是可以接受的吗?或者名称:cat1:Cat2是固定的和可靠的吗?@Arthurlfeldt这些名称是固定的和可靠的。我通过你上面使用的方法找到了这个组,但之后就再也不会想到zipmap了。最后,我需要使用cheshire生成一个json字符串来创建一个数据文件。我会尝试这些新信息并告诉你。效果很好。谢谢你的回复。
(def data [{:Gender "Boy" :Cat1 "Foo" :Cat2 "Bar" :SKU 111}
           {:Gender "Boy"  :Cat1 "Foo" :Cat2 "Bar" :SKU 222}
           {:Gender "Girl" :Cat1 "Foo" :Cat2 "Bar" :SKU 333}
           {:Gender "Boy" :Cat1 "Foo" :Cat2 "Woo" :SKU 444}])


(defn gp-by [data key]
  (->> (group-by key data)
       (map (fn [[k v]] {:Name k
                        :Children (map #(dissoc % key) v)}))))


(map (fn [m] (assoc m :Children
                   (map (fn [n] (assoc n :Children (gp-by (n :Children) :Cat2)))
                        (gp-by (m :Children) :Cat1)))) (gp-by data :Gender))