Clojure:使用切换键和另一个地图中的值创建地图

Neo*_*mov 1 clojure

我试图从输入创建一种恢复索引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 ..),用于将值与数组一起提供给地图.

然后我将它们合并在一起以获得我的期望值.

这里有两个问题:

  1. 这似乎比我有直觉的要复杂得多
  2. 目前的最终结果还不完善,因为我得到了这个:

    {"a"(\ i\d - \1\i\d - \2),"b"(\ i\d - \1\i\d - \2),"c"(\ i\d -\1\i\d - \2)}

A. *_*ebb 8

使用地图解构:

(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)