我試圖從輸入map
創建一種還原索引。輸入地圖我得到的是:Clojure:使用切換鍵和其他地圖中的值創建地圖
{"id-1" {"values" ["a" "b" "c"]}, "id-2" {"values" ["a" "b" "c"]}}
然後我想有這等映射作爲結果:
{"a" ["id-1" "id-2"], "b" ["id-1" "id-2"], "c" ["id-1" "id-2"]}
但是,我認爲,我的腦海裏沒有發瘋,我覺得我畫自己變成角落裏沒有能夠思考的框框。下面是我得到了什麼,到目前爲止,它看起來像它太臭:
(->> {"id-1" {"values" ["a" "b" "c"]} "id-2" {"values" ["a" "b" "c"]}}
(map #(->> (get (second %) "values")
(map (fn [x y] (hash-map y x)) (into [] (repeat (count (get (second %) "values")) (first %))))
(apply merge-with concat)))
(apply merge-with concat))
基本上,我仍然使用在「迭代」在我所有的輸入值第一map
。然後,我使用第二個圖來創建一系列單獨的地圖看起來像:
({"a" "id-2"} {"b" "id-2"} {"c" "id-2"} {"a" "id-1"} {"b" "id-1"} {"c" "id-1"})
爲了達到這樣的地圖,我創建使用into [] (repeat ..)
與價值觀的陣列一起喂到地圖中間陣列。
然後我將它們合併在一起以獲得我的期望值。
兩個問題在這裏:
- 這似乎真的要複雜得多,比我的直覺,這是
,因爲我得到這個當前的最終結果尚不完善:
{「a」(\ i \ d - \ 1 \ i \ d - \ 2),「b」(\ i \ d - \ 1 \ i \ d - \ 2) \ 1 \ i \ d - \ 2)}
感謝,它的工作原理完全如預期,並且肯定是很多很多打掃得比我做了什麼。然而,我不清楚在這種情況下「partial」是如何工作的,你能否詳細說明它在那裏的工作原理? – Neoasimov
@Neoasimov它基本上創建了一個函數,它接受一個參數(或更多),然後使用該參數調用'apply extract'。比'#(apply extract%)'更好,恕我直言。 – sloth
好的,謝謝你的解釋。是的,我注意到了這個變體,我正在分析它。這個例子非常適合在Clojure中尋找處理這類數據的新方法,謝謝!我得到了我需要的一切,甚至更多:) – Neoasimov