【问题标题】:idiomatic map join in clojure?惯用地图加入clojure?
【发布时间】:2012-08-18 14:47:38
【问题描述】:

我有一个如下所示的数据结构:

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

这是一个惯用的连接还是其他更可取的方法?

干杯

【问题讨论】:

    标签: join clojure merge


    【解决方案1】:

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

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

    注意返回值是一个集合。省略最后一个参数会导致自然连接;详情请见(doc clojure.set/join)

    【讨论】:

    • marczyk,关于外连接的任何想法,左,右,n 满?如果我想保持左边的字典不变,如果它在另一边没有匹配?
    • clojure.set 不提供任何外连接功能,当然可以自己编写。不过,这是一个单独问题的主题;事实上,以前有人问过,例如here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2018-11-21
    相关资源
    最近更新 更多