1

在 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 中使用枚举,就像我提到的其他语言(如 objc)一样。

谢谢 :)

4

4 回答 4

6

它有点难看,但你可以这样做:

var i=1;
var State = {
   STATE_A: i++,
   STATE_B: i++,
   STATE_C: i++
}
于 2013-03-21T03:46:58.513 回答
2

给他们一个初始值 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++;
}
于 2013-03-21T03:46:09.450 回答
2

如果我理解正确,您的目标是用数字识别状态,以使它们在枚举中具有可比性。

首先 ,这是我认为您的意思的工作小提琴。

对于一般枚举,这是我使用的一个不错的技巧:

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出自哪里。所以例如

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

将返回一个State具有诸如等属性的枚举State_aa,如果您愿意,可以使用toUpperCase它来强制使用您使用的大写约定。

于 2013-03-21T03:54:12.387 回答
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"]);

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

于 2013-03-21T04:02:40.440 回答