在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。
谢谢:)
答案 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++;
}