2011-06-14 53 views
9

我想定义具有连续的整数值的常量列表,例如:JavaScript的枚举?

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

但它是无聊加"XX" : y每次我需要在里面添加新元素的时间。
所以我想知道是否有类似于C中的enumerator,所以我可以写:
var config.type = {"RED", "BLUE", "YELLO"}并且它们被自动赋予唯一的整数值。

+1

为什么不直接使用数组? – ngen 2011-06-14 16:27:40

+0

@恩也许我没有说清楚。我想引用像这样的类型:config.type.RED或config.type.BLUE,而不是config.type [0] – wong2 2011-06-15 03:36:32

回答

15

你也可以尝试做这样的事情:

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

甚至使用参数的参数,你可以完全与阵列做掉:

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

只需使用一个数组:

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

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

这也可以让你做'config.type.indexOf('BLUE'); // 1'来获得相反的结果,如果你已经有了颜色并且需要找到索引值。 – daybreaker 2011-06-14 16:28:59

+0

@daybreaker,这应该是真的 – Neal 2011-06-14 16:29:36

+1

也许我没有说清楚。我想引用像这样的类型:config.type.RED或config.type.BLUE,而不是config.type [0] – wong2 2011-06-15 03:37:21

2

使用,而不是一个对象({})的阵列([]),然后翻转数组来交换密钥/值。

1

我想你可以做的是接受一个数组的函数:

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} 

或者采取同样的功能,并将其添加应用到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

你不能做第一个函数使用函数的'arguments'变量并传递在一个不确定的数量的参数,而不是一个数组? – Neal 2011-06-14 16:40:08

+0

@尼尔:绝对。好点子。 – user113716 2011-06-14 16:54:23