2011-06-14 74 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