解析项目的clojure地图 - >类别 - 矢量到分类列表中

时间:2012-02-29 21:39:37

标签: clojure compojure noir hiccup

我有项目名称和矢量矢量的映射,它们存储了关键字符串项目所在的类别。我试图将这个地图解析成几个打嗝的defpartials,然后可以按类别显示它们。

我认为我需要做的是解析一次地图以制作一组所有可能的类别和子类别。一旦我有了,我可以迭代它并过滤主映射中的所有匹配以获得正确的键字符串。

如何从下面的地图转到一组所有主要和子类别?一旦我有了这个集合,我如何使用它通过值而非按键查询原始地图?

感谢您的帮助!

(def ITEM-CATEGORIES
 { "thingy"          [["CatergoryA" "SubcategoryA"]]
   "thingy2"         [["FFT"]]
   "thingy3"         [["Generators" "Chaotic"]]
   "thingy4"         [["Analysis" "Pitch"] ["MachineListening"]]
   "thingy5"         [["Multichannel" "Ambisonics"]]
 }

sudo代码中的目标

(generate-hiccup-partial (create-set-of-unique-categories ITEM-CATEGORIES) ITEM-CATEGORIES)
....
(defpartial generate-hiccup-partial
  [categories map]
   ;; hiccup code
   (in-each-sub/main-category-get-keys-by-value categories map))  ;; return a list of all keys with the same categories

2 个答案:

答案 0 :(得分:1)

当我发现我的自我思考上下嵌套数据结构时,我的思绪跳到zipper library你可以拿出ITEM-CATECORIES并建立一个拉链然后通过'拉链'来建立任意数量的关系在树下。

答案 1 :(得分:1)

我不知道什么是defpartial,但这会改变那张地图:

(defn xform [ic]
  (reduce (fn [result [k [vs]]]
        (reduce (fn [r v]
              (assoc r v (cons k (r v)))))
            result vs))
      {} ic))

user=> (xform ITEM-CATEGORIES)
{"SubcategoryA" ["thingy"], "CatergoryA" ["thingy"], "Ambisonics" ["thingy5"],
 "Multichannel" ["thingy5"], "Pitch" ["thingy4"], "Analysis" ["thingy4"],
 "Chaotic" ["thingy3"], "Generators" ["thingy3"], "FFT" ["thingy2"]}