javascript enum auto-increment?

javascript enum auto-increment?

本文关键字:auto-increment enum javascript      更新时间:2023-09-26

在objc中,我可以这样使用enum:

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。

谢谢:)

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

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

将它们的初始值都设置为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++;
}

你可以创建你的小枚举生成器,它既可以自动编号,也可以让你设置任何你想要的值(有点像你在objective中的功能:

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

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

如果我理解正确的话,您的目标是用数字来识别状态,以便在枚举中进行比较。

首先这里是一个工作小提琴,我认为你的意思。

对于一般的枚举,我使用了一个很好的技巧:

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_aa等属性的State enum,如果您愿意,您可以在其上使用toUpperCase来强制使用大写约定。