2013-03-21 81 views
0

在objc我可以使用枚舉這樣的:每個變量的javascript枚舉自動增量?

typedef enum { 
    STATE_A = 1, 
    STATE_B, 
    STATE_C, 
    ...... 
    STATE_KK = 100, 
    STATE_FF, 
    ...... 
    STATE_XXX = 99999 
} State; 

的值是自動增加(相比,前者的一個)。

但在JavaScript中,我需要:

var State = { 
    STATE_A: 1, 
    STATE_B: 2, 
    STATE_C: 3, 
    ...... 
    STATE_KK: 100, 
    STATE_FF: 101, 
    ...... 
    STATE_XXX = 99999 
} 

你看我需要爲每個varible所有的價值觀,這是真的生病了,當你 得到了很多varible存在的,它甚至病情加重時,得到你試圖插入一個變量之間,所以你必須問問自己(它應該是什麼值)?

我對js很新,真的想知道是否有一種方法可以使用枚舉在js中的方式就像其他語言 ,如我提到的objc。

謝謝:)

+0

爲什麼你需要這麼多的狀態? – 2013-03-21 03:35:31

+3

在JavaScript這樣的結構沒有意義(至少基於對象)因爲對象不保留順序。 – dfsq 2013-03-21 03:35:56

+0

@dfsq - 我認爲這個想法是將一個整數註冊到一個鍵,可能有點像一個公司nstant。換句話說,在創建列表之後,我不知道這個順序很重要。 – 2013-03-21 03:38:41

回答

1

如何給他們所有的初始值0,然後設置其值的一環

var State = { 
    STATE_A: 0, 
    STATE_B: 0, 
    STATE_C: 0, 
    ...... 
    STATE_KK: 0, 
    STATE_FF: 0, 
    ...... 
    STATE_XXX = 0 
} 
var count=0; 
for(var key in State){ 
    State[key]=count++; 
} 
3

同類醜陋,但你可以這樣做:

var i=1; 
var State = { 
    STATE_A: i++, 
    STATE_B: i++, 
    STATE_C: i++ 
} 
+1

我懷疑這種想法忽略了整體觀點(參見dfsq和我在這個問題下的評論)。這更多的是*圖案填充*我*想*。 – 2013-03-21 03:51:17

2

如果我理解正確,你的目標是用數字來標識狀態,以便使它們在枚舉中具有可比性。

首先here is a working fiddle什麼,我認爲你的意思。

對於一般的枚舉,這裏是一個很好的把戲我用:

function createEnum(values){ 
    var res={}; 
    for(var i=0;i<values.length;i++){ 
     res[values[i]]=i;//add the property 
    } 
    //Object.freeze(res);//optional to make immutable 
    return res; 
}; 

這讓下面的語法

var State = createEnum(["STATE_A","STATE_B","STATE_C"]); 

這意味着你不必明確定義所有的整數值。國家,一個給出。之後,你可以正常使用

State.STATE_A===State.STATE_B;//returns 1 

如果您想基於圖案進行填充,可以延長這個下面的方式(假設你的語法):

function createEnumPattern(prefix,range){ 
    var res={},str="a"; 
    for(var i=0;i<range;i++){ 
     var pattern = prefix+"_"+inc_str(str); 
     res[pattern]=i;//add the property 
    } 
    //Object.freeze(res);//optional to make immutable 
    return res; 
} 

哪裏inc_str是從this answer。 因此,例如

var State = createEnumPattern("State",100); 

會返回一個State枚舉與像State_aa性質等,如果你願意,你可以使用toUpperCase它迫使你使用大寫的約定。

2

您可以創建兩個自動編號他們,可以讓你設置你想要的任何值(有點像的功能,你在的ObjectiveC有你的小枚舉製造商:

function makeEnum(list) { 
    var obj = {}, sequence = 0, current; 
    for (var i = 0; i < list.length; i++) { 
     current = i; 
     if (typeof list[i+1] === "number") { 
      sequence = list[i+1]; 
      i++; 
     } 
     obj[list[current]] = sequence++; 
    } 
    return(obj); 
} 

var State = makeEnum(["STATE_A","STATE_B","STATE_C", "STATE_KK", 100, "STATE_LL"]); 

任何你放了多少的通過數組,它設置以前的枚舉值的值,然後序列繼續從那個值。