2012-02-29 2 views
2

У меня есть карта имен элементов и векторов векторов, в которых хранятся категории, в которых находится элемент строчной строки. Я пытаюсь разобрать эту карту на пару с икотой 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 
+0

Определение ITEM-КАТЕГОРИЙ отсутствует закрывающую скобку в конце. Я собирался исправить это, но SO будет отскакивать от одного символа. Можете ли вы его изменить? – user100464

ответ

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"]} 
+0

потрясающий! это то, что мне нужно. спасибо большое –

+1

Не могли бы вы заменить '(if-let [rv (r v)] (cons k rv) [k])' с '(cons k (r v nil))'? – Retief

+0

Спасибо Retief. На самом деле я могу использовать '(cons k (r v))'. Я уточню свой ответ. – user100464

1

Когда я нахожу мой сам думать о движении вверх и вниз вложенной структуры данных, мой ум прыгает в zipper library вы могли бы принять ITEM-CATECORIES и построить молнию его затем произведите любое количество отношений путем «застегивания» вверх и вниз по дереву.

+0

спасибо, я еще не проверил библиотеку на молнии, но это очень полезно. –

 Смежные вопросы

  • Нет связанных вопросов^_^