【问题标题】:Parsing a clojure map of items -> categories-vectors into categorized lists将项目 -> 类别向量的 clojure 映射解析为分类列表
【发布时间】:2012-03-19 09:47:50
【问题描述】:

我有项目名称的地图和存储关键字符串项目所在类别的向量向量。我试图将此地图解析为几个打嗝的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

【问题讨论】:

  • ITEM-CATEGORIES 的定义在末尾缺少右括号。我打算修复它,但 SO 会反弹一个字符的编辑。能改吗?

标签: clojure compojure noir hiccup


【解决方案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"]}

【讨论】:

  • 你不能用(cons k (r v nil))替换(if-let [rv (r v)] (cons k rv) [k])吗?
  • 谢谢 Retief。事实上我可以使用(cons k (r v))。我会更新我的答案。
【解决方案2】:

当我发现自己在考虑上下嵌套数据结构时,我的思绪会跳到zipper library,你可以使用 ITEM-CATECORIES 并构建它的拉链,然后通过上下“压缩”来建立任意数量的关系树。

【讨论】:

  • 谢谢,我还没有查看 zipper 库,但这非常有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
相关资源
最近更新 更多