Skip to content

Instantly share code, notes, and snippets.

@tfrisk-old
Last active December 24, 2015 18:09
Show Gist options
  • Save tfrisk-old/6841473 to your computer and use it in GitHub Desktop.
Save tfrisk-old/6841473 to your computer and use it in GitHub Desktop.
Search map entries with specific values in Clojure vector of maps.
(def testmap [
{:id "123" :name "name1"}
{:id "369" :name "name3"}
{:id "246" :name "name2"}])
; finds matches but doesn't return them correctly
(defn find-items-by-name [searchtext]
(doseq [entry testmap]
(let [{:keys [id name]} entry]
(if (= name searchtext) (println "found text" searchtext "at id" id)))))
;I tried into but no luck
(defn find-items-by-name [searchtext]
(into []
(doseq [entry testmap]
(let [{:keys [id name]} entry]
(if (= name searchtext) (str id))))))
; Okay, doseq is for side-effecting (printing etc.) stuff. Replacing doseq with for gives results
(defn find-items-by-name [searchtext]
(into []
(for [entry testmap]
(let [{:keys [id name]} entry]
(if (= name searchtext) (str id))))))
; user=> (find-items-by-name "name1")
; ["123" nil nil]
;(into [] map()) approach perhaps isn't the best for this but it works for now.
;TODO: use regexp for name matching
(defn search-items-by-name [searchtext]
(vec ; return vector
(filter identity ; filter out nil entries
(into [] (map (fn [m] ; go thru the whole collection
(if (= (:name m) searchtext) (:id m))) ; add current id to results if name matches
testmap))))) ; collection to use for searching
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment