2010-02-14 11 views
5

Decir que tengo una colección de mapas:En Clojure, ¿cómo podría crear una función "agregar ID al mapa"?

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

Quiero una función que añadirá un id (un número único está muy bien) a cada elemento del mapa en la colección. es decir

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

Lo siguiente NO FUNCIONA, pero es la línea de pensamiento que tengo actualmente.

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

Gracias de antemano ...

Respuesta

8

¿Qué tal

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

O

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

¡Ah! Su segunda función es exactamente lo que estaba tratando de hacer con la pereza. ¡Gracias! – scrotty

+1

También podría usar (rango), ya que eso es equivalente a su iteración – amalloy

11

Si quieres ser muy, muy seguro de que los identificadores son únicos, utilizar UUID s.

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

Gracias, Brian. Ojalá pudiera otorgar dos respuestas correctas. Bugspy.net's logra exactamente lo que estoy buscando, pero estoy teniendo en cuenta los tuyos si la verdadera singularidad se vuelve importante. – scrotty

Cuestiones relacionadas