我试图从输入创建一种恢复索引map.我得到的输入图是:
{"id-1" {"values" ["a" "b" "c"]}, "id-2" {"values" ["a" "b" "c"]}}
Run Code Online (Sandbox Code Playgroud)
然后我希望将此其他地图作为结果:
{"a" ["id-1" "id-2"], "b" ["id-1" "id-2"], "c" ["id-1" "id-2"]}
Run Code Online (Sandbox Code Playgroud)
但是,我认为我的思绪确实发疯了,而且我认为自己已经把自己画成了角落而没有开箱即用.这是我到目前为止所得到的,它看起来很臭:
(->> {"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))
Run Code Online (Sandbox Code Playgroud)
基本上,我使用第一个map用于"迭代"我的所有输入值.然后我使用第二个地图创建一系列看起来像这样的单独地图:
({"a" "id-2"} {"b" "id-2"} {"c" "id-2"} {"a" "id-1"} {"b" "id-1"} {"c" "id-1"})
Run Code Online (Sandbox Code Playgroud)
为了获得该地图,我创建了一个中间数组into [] (repeat ..),用于将值与数组一起提供给地图.
然后我将它们合并在一起以获得我的期望值.
这里有两个问题:
目前的最终结果还不完善,因为我得到了这个:
{"a"(\ i\d - \1\i\d - \2),"b"(\ i\d - \1\i\d - \2),"c"(\ i\d -\1\i\d - \2)}
使用地图解构:
(apply merge-with into (for [[k {vs "values"}] input, v vs] {v [k]}))
Run Code Online (Sandbox Code Playgroud)
更清晰
(apply merge-with into
(for [[k m] input
v (get m "values")]
{v [k]}))
Run Code Online (Sandbox Code Playgroud)