javascript枚举自动增量?

时间:2013-03-21 03:33:05

标签: javascript objective-c

在objc中我可以像这样使用枚举:

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
}

你看我需要指定每个变量的所有值,这对你来说真的很恶心 那里有很多变量,当你试图在它们之间插入一个变量时,它会变得更加严重 你必须问自己(应该是什么价值?)

我对js很新,并且真的想知道是否有一种方法在js中使用enum,就像在其他语言中一样 比如我提到的objc。

谢谢:)

4 个答案:

答案 0 :(得分:3)

它的丑陋,但你可以这样做:

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

答案 1 :(得分: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 :(得分: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"]);

在传入的数组中放置一个数字的任何地方,它设置前一个枚举值的值,然后序列从该值继续。

答案 3 :(得分: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++;
}