惯用地图加入clojure?

时间:2012-08-18 14:47:39

标签: join clojure merge

我有一个看起来像这样的数据结构:

(def conf 
  { :devices [{:alias "OSC Sender",
               :name "OSC Sender",
               :ins [{:name "xpos", :type :int, :mutable true}]},
              {:alias "const2", :name "const",
               :outs [{:name "out", :type :int}]}],
    :connections {"const2.out" "OSC Sender.xpos"},
    :layout [{:alias "const2",
              :x 72.12447405329594,
              :y 99.88499298737729},
             {:alias "tick",
              :x 82.5732819074334,
              :y 133.91374474053296},
             {:alias "OSC Sender",
              :x 185.17741935483872,
              :y 113.90322580645162}]})

我想通过密钥(特别是:devices)加入:layout:alias中的地图,以丰富设备的布局信息。

现在我拼凑了以下解决方案:

(map (partial reduce merge) (vals (group-by :alias (concat (:devices conf) (:layout conf)))))

这是一种惯用的联系还是其他更好的选择?

干杯

1 个答案:

答案 0 :(得分:7)

您可以使用join命名空间中的clojure.set函数:

(clojure.set/join (conf :devices) (conf :layout) {:alias :alias})

请注意,返回值是一个集合。省略最后一个参数会导致自然连接;有关详细信息,请参阅(doc clojure.set/join)