2011-04-17 9 views
5

tengo una matriz que consiste de A LOT de Symbol objetos:¿Cómo debo generar identificadores únicos para un grupo de objetos?

var symbols = { 
    alpha : new Symbol('alpha', 'symbol_0', '&#x03B1', 'GreekSymbol'), 
    beta : new Symbol('beta', 'symbol_1', '&#x03B2', 'GreekSymbol'), 
    gamma : new Symbol('gamma', 'symbol_2', '&#x03B3', 'GreekSymbol'), 
    delta : new Symbol('delta', 'symbol_3', '&#x03B4', 'GreekSymbol'), 

    ... about 500 of these different types of symbols... 
}; 

El segundo parámetro para el objeto Symbol es una ID que se usará en HTML. Como las especificaciones HTML no permiten identificaciones duplicadas, deseo asignar a cada Symbol una ID única y aún así poder saber que esta ID corresponde a Symbol. Así que me gusta la idea de tener el prefijo symbol_ pero no me gusta la idea de escribir manualmente symbol_0 a través de symbol_500.

¿Cómo debo generar identificaciones únicas? ¿Puedo automatizar este proceso y generar una identificación única cuando declaro la matriz anterior?

ACTUALIZACIÓN
¿Es realmente una buena idea hacer esto en el cliente?

Respuesta

6

Hacer una función que incrementa un contador:

function makeCounter() { 
    var i = 0; 
    return function() { 
     return i++; 
    } 
} 

var id = makeCounter(); 

Ahora cada llamada a id devolverá un valor único:

id(); // 0 
id(); // 1 
id(); // 2 
id(); // 3 

utilizar de esta manera:

new Symbol('alpha', 'symbol_' + id(), '&#x03B1,', 'GreekSymbol') 

Un una versión más completa le permitirá especificar el prefijo y un valor de inicio opcional:

function generateId(prefix, start) { 
    var i = start || 0; 
    return function() { 
     return prefix + i++; 
    } 
} 
// start the counter at 12 
var id = generateId("symbol_", 12); 
id(); 

Salida:

"symbol_12" 
+0

¿Por qué no 'makeCounter' devolverá' 1' cada vez dado que restablece el valor de 'var i' cada vez que llama a la función? – Sir

+0

Solo llama a 'makeCounter' * una vez *. Sucede aquí: 'var id = makeCounter();'. Después de eso, llamas a la función * devuelta * por 'makeCounter', que hemos asignado a' id'. Esta función * cierra * la variable 'i', lo que significa que cada invocación está incrementando el mismo contador. –

0

Si sólo tiene 500 o más para elegir, usted podría desmenuzar el contenido del símbolo junto con una implementación JS MD5, o incluso sólo tiene que utilizar un generador de UUID JS como éste: http://ajaxian.com/archives/uuid-generator-in-javascript

Si esto la información es persistente en todas las sesiones y en el servidor almacenado, sería mejor que hicieras esta parte en el servidor.

+0

¿Qué es JS MD5 y JS UUID? – Hristo

+1

JS es Javascript. MD5 es un algoritmo hash. Un UUID es una ID única. –

1

un objeto simple que realiza un seguimiento del número de llamadas deben trabajar.

function IdGenerator(baseName) { 
    this.baseName = "" + baseName; 
    this.number = 0; 
} 

IdGenerator.prototype.next = function() { 
    return "" + this.baseName + this.number++; 
}; 

var gen = new IdGenerator("symbol_") 
for (var i = 0; i < 100; i++) { 
    console.log(gen.next()); 
} 
+0

Me gusta mucho la idea de poder especificar el prefijo. Esto es realmente bueno, gracias! – Hristo

+0

@ ChaosPandion ... ¿por qué tienes las dos comillas dobles '" "' antes de agregar cosas? – Hristo

Cuestiones relacionadas