1

我在 clojure 中合并两个哈希图,但它给出了意想不到的结果。以下是我要合并的两个数据集:

({:TEST"E", :EMEA "0", :NA "0", :ASPAC "180"}
{:TEST"B", :EMEA "0", :NA "70", :ASPAC "0"}
{:TEST"D", :EMEA "38", :NA "0", :ASPAC "0"} 
{:TEST"C", :EMEA "0", :NA "0", :ASPAC "0"}
{:TEST"G", :EMEA "360", :NA "0", :ASPAC "0"}
{:TEST"A", :EMEA "45", :NA "0", :ASPAC "0"} 
{:TEST"F", :EMEA "0", :NA "0", :ASPAC "66"})


({:TEST"A", :EMEA_1 "40", :NA_1 "0", :ASPAC_1 "0"}
{:TEST"B", :EMEA_1 "90", :NA_1 "0", :ASPAC_1 "0"}
{:TEST"H", :EMEA_1 "0", :NA_1 "120", :ASPAC_1 "0"} 
{:TEST"C", :EMEA_1 "0", :NA_1 "85", :ASPAC_1 "0"})

我期待看到这样的东西:

({:TEST"A", :EMEA "45", :NA "0", :ASPAC "0", :EMEA_1 "40", :NA_1 "0", :ASPAC_1 "0"}
{:TEST"B", :EMEA "0", :NA "70", :ASPAC "0", :EMEA_1 "90", :NA_1 "0", :ASPAC_1 "0"}
{:TEST"C", :EMEA "0", :NA "0", :ASPAC "0",  :EMEA_1 "0", :NA_1 "85", :ASPAC_1 "0"}
{:TEST"D", :EMEA "38", :NA "0", :ASPAC "0", :EMEA_1 nil, :NA_1 nil, :ASPAC_1 nil}
{:TEST"E", :EMEA "0", :NA "0", :ASPAC "180", :EMEA_1 nil, :NA_1 nil, :ASPAC_1 nil}
{:TEST"F", :EMEA "0", :NA "0", :ASPAC "66", :EMEA_1 nil, :NA_1 nil, :ASPAC_1 nil}
{:TEST"G", :EMEA "360", :NA "0", :ASPAC "0", :EMEA_1 nil, :NA_1 nil, :ASPAC_1 nil}
{:TEST"H", :EMEA nil, :NA nil, :ASPAC nil, :EMEA_1 "0", :NA_1 "120", :ASPAC_1 "0"})

我尝试过使用合并、合并-wth、应用合并-但没有给我预期的结果。

关于如何获得我想要的结果集或为什么我实际上没有得到我期望的结果的任何建议也会有所帮助。

谢谢。

4

1 回答 1

5

鉴于您的两个集合定义为 coll1 和 coll2:

(map (partial apply merge) (-> (clojure.set/union coll1 coll2)
                               (clojure.set/index [:TEST])
                               vals))

应该会导致您想要的结果。

如果你不想要 clojure.set 你也可以使用

(map (partial apply merge) (->>  (concat coll1 coll2)
                                 (group-by :TEST)
                                 vals))

但是查看您的数据结构,它们看起来更像是 clojure.set 的一个案例。

您可能会注意到结果不会有类似 [:key nil] 的条目。如果你想要它们,当然有一种方法,但依赖它们与 nil 的含义背道而驰。

于 2013-05-30T14:37:11.527 回答