2011-04-17 21 views
5

Ho un array costituito da A LOT di Symbol oggetti:Come dovrei generare ID univoci per un gruppo di oggetti?

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... 
}; 

Il secondo parametro per l'oggetto Symbol è un ID che verrà utilizzato in HTML. Poiché le specifiche HTML non consentono ID duplicati, desidero assegnare a ciascun Symbol un ID univoco ed essere ancora in grado di sapere che questo ID corrisponde a Symbol. Quindi mi piace l'idea di avere il prefisso symbol_ ma non mi piace l'idea di digitare manualmente symbol_0 tramite symbol_500.

Come devo generare ID univoci? Posso automatizzare questo processo e generare un ID univoco quando sto dichiarando l'array sopra?

UPDATE
E 'davvero una buona idea per fare questo lato client?

risposta

6

Fare una funzione che incrementa un contatore:

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

var id = makeCounter(); 

Ora ogni chiamata a id restituirà un valore unico:

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

usare in questo modo:

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

A una versione più completa delle caratteristiche consentirebbe di specificare il prefisso e un valore iniziale facoltativo:

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

uscita:

"symbol_12" 
+0

Perché 'makeCounter' non restituisce' 1' ogni volta in cui viene ripristinato il valore di 'var i' ogni volta che si chiama la funzione? – Sir

+0

Si chiama 'makeCounter' * una sola volta *. Succede qui: 'var id = makeCounter();'. Dopodiché chiami la funzione * restituita * da 'makeCounter', che abbiamo assegnato a' id'. Questa funzione * chiude * la variabile 'i', il che significa che ogni invocazione sta incrementando lo stesso contatore. –

0

Se avete solo 500 o giù di lì da scegliere, si può solo hash il contenuto del simbolo insieme con un'implementazione JS MD5, o anche solo di utilizzare un generatore di UUID JS come questo: http://ajaxian.com/archives/uuid-generator-in-javascript

Se questo i dati sono persistenti tra le sessioni e memorizzato sul lato server, sarebbe meglio fare questa parte sul server.

+0

Che cos'è JS MD5 e JS UUID? – Hristo

+1

JS è Javascript. MD5 è un algoritmo di hashing. Un UUID è un ID univoco. –

1

Un oggetto semplice che tiene traccia del numero di chiamate dovrebbero funzionare.

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

Mi piace molto l'idea di poter specificare il prefisso. Questo è davvero buono, grazie! – Hristo

+0

@ChaosPandion ... perché hai le due virgolette doppie "" "prima di aggiungere elementi? – Hristo

Problemi correlati