Skip to content

Instantly share code, notes, and snippets.

@yayitswei
Created August 2, 2013 17:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yayitswei/6141890 to your computer and use it in GitHub Desktop.
Save yayitswei/6141890 to your computer and use it in GitHub Desktop.
; update-vec merges a vector based on the :id's of its contents
(update-vec [{:id 1 :data "1"} {:id 2 :data "2"}] {:id 3 :data "3"})
;=> [[{:id 1 :data "1"} {:id 2 :data "2"} {:id 3 :data "3"}]]
(update-vec [{:id 1 :data "1"} {:id 2 :data "2"}] {:id 2 :data "tonystark"})
;=> [[{:id 1 :data "1"} {:id 2 :data "tonystark"}]]
@kohyama
Copy link

kohyama commented Aug 2, 2013

How about below?

(require '[clojure.test :refer (with-test is run-tests)])

(with-test
  (defn update-vec [som m]
    (if-let [i (first (keep-indexed #(if (= (:id %2) (:id m)) %1) som))]
      (assoc som i m)
      (conj som m)))

  (is (= (update-vec [{:id 1 :data "1"} {:id 2 :data "2"}] {:id 3 :data "3"})
         [{:id 1 :data "1"} {:id 2 :data "2"} {:id 3 :data "3"}]))
  (is (= (update-vec [{:id 1 :data "1"} {:id 2 :data "2"}] {:id 2 :data "tonystark"})
         [{:id 1 :data "1"} {:id 2 :data "tonystark"}])))

HTH

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment