2

各マップ エントリが ID キーで識別される Clojure でマップの 2 つのリストをマージする慣用的な方法は何ですか?

fooそのための実装は何ですか

(foo '({:id 1 :bar true :value 1} 
       {:id 2 :bar false :value 2} 
       {:id 3 :value 3})
     '({:id 5 :value 5} 
       {:id 2 :value 2} 
       {:id 3 :value 3}
       {:id 1 :value 1} 
       {:id 4 :value 4})) => '({:id 1 :bar true :value 1}
                               {:id 2 :bar false :value 2}
                               {:id 3 :value 3}
                               {:id 4 :value 4}
                               {:id 5 :value 5})

本当ですか?

4

3 に答える 3

2
(defn merge-by
  "Merges elems in seqs by joining them on return value of key-fn k.
   Example: (merge-by :id [{:id 0 :name \"George\"}{:id 1 :name \"Bernie\"}]
                          [{:id 2 :name \"Lara\"}{:id 0 :name \"Ben\"}])
   => [{:id 0 :name \"Ben\"}{:id 1 :name \"Bernie\"}{:id 2 :name \"Lara\"}]"
  [k & seqs]
  (->> seqs
       (map (partial group-by k))
       (apply merge-with (comp vector
                               (partial apply merge)
                               concat))
       vals
       (map first)))
于 2013-08-21T23:07:52.757 に答える
1

これはどう:

(defn foo [& colls]
  (map (fn [[_ equivalent-maps]] (apply merge equivalent-maps)) 
       (group-by :id (sort-by :id (apply concat colls)))))
于 2013-08-21T17:50:56.940 に答える