2011-06-14 12 views
9

quiero definir una lista de constantes que tienen valor entero continuo, por ejemplo:enumerador de JavaScript?

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

Pero es aburrido añadir un "XX" : y cada vez que tengo que añadir un nuevo elemento en el mismo.
Así que me pregunto si hay algo así como enumerator en C, así que solo puedo escribir:
var config.type = {"RED", "BLUE", "YELLO"} y se les asigna automáticamente un valor entero único.

+1

Por qué no utilizar ¿una matriz? – ngen

+0

@ngen tal vez no lo dejé en claro. Me gustaría referirme a un tipo como este: config.type.RED o config.type.BLUE, no config.type [0] – wong2

Respuesta

15

También puede tratar de hacer algo como esto:

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); 

o incluso utilizando el parámetro de argumentos, se puede acabar con el arsenal completo:

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

sólo tiene que utilizar una matriz:

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

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

Esto también te permite hacer 'config.type.indexOf ('BLUE'); // 1' para obtener el reverso si ya tiene los colores y necesita encontrar el valor del índice. – daybreaker

+0

@daybreaker, eso debería ser cierto también – Neal

+1

tal vez no lo dejé en claro. Me gustaría referirme a un tipo como este: config.type.RED o config.type.BLUE, no config.type [0] – wong2

2

utilizar una matriz ([]) en lugar de un objeto ({}), y luego la vuelta de la matriz para intercambiar llaves/valores.

1

supongo que se podría hacer una función que acepta un array:

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} 

o tomar la misma función, y agregarlo a Array.prototype.

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

no se puede hacer esa primera función usando la variable 'arguments' de la función y pasando en una cantidad indeterminada de parámetros en lugar de una matriz? – Neal

+0

@Neal: Absolutamente. Buen punto. – user113716

Cuestiones relacionadas