2011-04-17 18 views
5

Bir dizi bir LOT arasındaSymbol nesne aşağıdakilerden oluşan sahiptir:Bir grup nesne için nasıl benzersiz kimlikler üretmeliyim?

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

Symbol nesne için ikinci parametre HTML kullanılacak bir kimliktir. HTML özellikleri, çoğaltılmış kimliklere izin vermediğinden, her bir Symbol'a benzersiz bir kimlik atamak ve yine de bu kimliğin Symbol'a karşılık geldiğini bilmek istiyorum. Bu yüzden, symbol_ ön ekine sahip olma fikrini beğendim ama symbol_500 aracılığıyla el ile symbol_0 yazmayı sevmiyorum.

Benzersiz kimlikler nasıl oluşturmalıyım? Yukarıdaki işlemi bildirdiğimde bu işlemi otomatikleştirebilir ve benzersiz bir kimlik oluşturabilir miyim?

GÜNCELLEME
bu istemci tarafı yapmak için iyi bir fikir aslında var mı?

cevap

6

bir sayacı artırır bir işlev yapın:

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

böyle kullanın:

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

A

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

var id = makeCounter(); 

Şimdi id yapılan her çağrı benzersiz bir değer dönecektir daha fazla özellikli sürüm, öneki ve isteğe bağlı bir başlangıç ​​değerini belirtmenize izin verir:

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

Çıktı:

"symbol_12" 
+0

Neden her seferinde işlev çağrıldığında "var i" değerini sıfırladığınızda verilen "1" işlevini makeCounter 'döndürür? – Sir

+0

Sadece "makeCounter' *" olarak adlandırın *. Burada olur: 'var id = makeCounter();'. Bundan sonra, "id" a atadığımız "makeCounter" ile * döndürülen * fonksiyonu çağırırsınız. Bu işlev * her bir çağrının aynı sayacı arttırdığı anlamına gelen 'i' değişkenini kapatır. –

0

sadece 500 ya böylece seçim için, sadece birlikte bir JS MD5 uygulaması ile sembolün içeriğini karma olabilir, hatta sadece bu gibi JS UUID jeneratör kullanıyorsanız: Bu takdirde http://ajaxian.com/archives/uuid-generator-in-javascript

Veriler oturumlar ve depolanan sunucular arasında kalıcıdır, bu bölümü sunucuda yapmanız daha iyi olur.

+0

JS MD5 ve JS UUID nedir? – Hristo

+1

JS Javascript'tir. MD5 bir karma algoritmadır. Bir UUID benzersiz bir kimliktir. –

1

çalışması gerekir aramaların sayısını tutar basit bir nesne.

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

Öneki belirtebilme fikrini gerçekten çok seviyorum. Bu gerçekten çok iyi, teşekkürler! – Hristo

+0

@ChaosPandion ... neden eşya eklemeden önce iki "çift" tırnak var? – Hristo