2011-06-14 6 views
9

Sürekli tamsayı değerine sahip olan sabitlerin bir listesini tanımlamak istiyorum, örneğin:JavaScript numaralayıcısı?

var config.type = {"RED": 0, "BLUE" : 1, "YELLO" : 2}; 

Ancak her zaman yeni bir eleman eklemem gerekecek bir "XX" : y eklemek sıkıcı.
Yani ben enumerator in C gibi bir şey var merak ediyorum sadece yazabilirim:
var config.type = {"RED", "BLUE", "YELLO"} ve otomatik olarak benzersiz bir tamsayı değeri verilir.

+1

Neden sadece kullanmayın bir dizi? – ngen

+0

@ngen belki açıklığa kavuşmamıştım. Bunun gibi bir türe başvurmak isterim: config.type.RED veya config.type.BLUE, config.type değil [0] – wong2

cevap

15

Ayrıca böyle bir şey yapmak için deneyebilirsiniz

function Enum(){ 
    for(var i = 0; i < arguments.length; ++i){ 
     this[arguments[i]] = i; 
    } 
    return this; 
} 
var config = {}; 
config.type = new Enum("RED","GREEN","BLUE"); 
// check it: alert(config.type.RED); 
4

Sadece bir dizi kullanın:

var config.type = ["RED", "BLUE", "YELLO"]; 

config.type[0]; //"RED" 
+1

Bu ayrıca 'config.type.indexOf ('BLUE'); Zaten renklere sahipseniz ve indeks değerini bulmanız gerekiyorsa // 1 'geri alın. – daybreaker

+0

@daybreaker, bu da doğru olmalıydı – Neal

+1

belki de açık vermedim. Bunun gibi bir türe başvurmak istiyorum: config.type.RED veya config.type.BLUE, config.type değil [0] – wong2

2

yerine bir nesne ({}) bir dizi ([]) kullanın, ardından tuşları/değerlerini takas diziyi çevirin.

1

Sana bir Array kabul eden bir işlev yapabilir varsayalım:

function constants(arr) { 

    for(var i = 0, len = arr.length, obj = {}; i < len; i++) { 
     obj[ arr[i] ] = i; 
    } 
    return obj; 
} 


var config.type = constants(["RED", "BLUE", "YELLO"]); 

console.log(config.type); // {"RED": 0, "BLUE" : 1, "YELLO" : 2} 

Ya da aynı işlevi almak ve Array.prototype ekleyin.

function Enum(values){ 
    for(var i = 0; i < values.length; ++i){ 
     this[values[i]] = i; 
    } 
    return this; 
} 
var config = {}; 
config.type = new Enum(["RED","GREEN","BLUE"]); 
// check it: alert(config.type.RED); 

hatta argümanlar parametresini kullanarak, tümüyle dizi uzak yapabilirsiniz:

Array.prototype.constants = function() { 

    for(var i = 0, len = this.length, obj = {}; i < len; i++) { 
     obj[ this[i] ] = i; 
    } 
    return obj; 
} 


var config.type = ["RED", "BLUE", "YELLO"].constants(); 

console.log(config.type); // {"RED": 0, "BLUE" : 1, "YELLO" : 2} 
+1

fonksiyonun 'arguments' değişkenini kullanarak bu fonksiyonu kullanamazsınız. bir dizi yerine belirsiz miktarda parametrede? – Neal

+0

@Neal: Kesinlikle. İyi bir nokta. – user113716