2010-02-14 23 views
5

Say mam kolekcję map:W Clojure, w jaki sposób mogę utworzyć funkcję "dodaj identyfikator do mapy"?

(def coll #{{:name "foo"} {:name "bar"}}) 

chcę funkcję, która doda identyfikator (unikatowy numer jest w porządku) do każdego elementu mapy w kolekcji. tj.

#{{:id 1 :name "foo"} {:id 2 :name "bar"}} 

Następujące NIE DZIAŁA, ale to linia myślenia, którą obecnie mam.

(defn add-unique-id [coll] 
(map assoc :id (iterate inc 0) coll)) 

góry dzięki ...

Odpowiedz

8

Jak o

(defn add-unique-id [coll] 
    (map #(assoc %1 :id %2) coll (range (count coll)))) 

Albo

(defn add-unique-id [coll] 
    (map #(assoc %1 :id %2) coll (iterate inc 0))) 
+0

Ah! Twoja druga funkcja jest dokładnie tym, co próbowałem zrobić z lenistwem. Dziękuję Ci! – scrotty

+1

Może i po prostu użyć (zakres), ponieważ jest to odpowiednik iteracji – amalloy

11

Jeśli chcesz być naprawdę pewny identyfikatory są unikalne, użyj UUID s.

(defn add-id [coll] 
    (map #(assoc % :id (str (java.util.UUID/randomUUID))) coll))
+0

Dziękuję, Brian. Chciałbym móc udzielić dwóch właściwych odpowiedzi. Bugspy.net osiąga dokładnie to, czego szukam, ale pamiętam o twoim pomyśle, jeśli prawdziwa wyjątkowość staje się ważna. – scrotty

Powiązane problemy