我在javascript中有以下"Enum"来指示我的应用程序的状态:
var State = {
STATE_A: 0,
STATE_B: 1,
STATE_C: 2
//...
}
Run Code Online (Sandbox Code Playgroud)
现在,我希望每个州都有一个"子国家".例如,STATE_B可能在... STATE_B1或STATE_B2...
什么是最好的结构方式?我会以某种方式在"枚举"中嵌入State"枚举"吗?谢谢
如果有一个更好的方法来完全构建这个(除了枚举)我都是耳朵.基本上我需要能够设置和检查我的应用程序的状态,并且每个状态都可以(但不是必需)附加一个可以设置和检查的子状态.如果解决方案允许我超过1级嵌套深度,那就更好了.
你在做什么并不是真正的枚举。您正在使用本机 Javascript 对象并将它们视为枚举,当您想要在 Javascript 中使用类似枚举的对象时,这是完全可以接受的。
要回答您的问题,是的,您可以完全嵌套对象:
var State = {
STATE_A: 0,
STATE_B:{
SUBSTATE_1 : "active",
SUBSTATE_2 : "inactive"
},
STATE_C: 2
//...
}
Run Code Online (Sandbox Code Playgroud)
然后您只需使用点符号来设置这些值,例如
State.State_B.SUBSTATE_2 = "active".
如果需要,您可以使用某种位字段:
var State = function() {
// Note this must increment in powers of 2.
var subStates = 8;
var A = 1 << subStates;
var B = 2 << subStates;
var C = 4 << subStates;
var D = 8 << subStates;
return {
// A
// Note this must increment in powers of 2.
STATE_A: A,
STATE_A1: A | 1,
STATE_A2: A | 2,
STATE_A3: A | 4,
STATE_A4: A | 8,
STATE_A5: A | 16
// B
STATE_B: B,
STATE_B1: B | 1,
// C
STATE_C: C,
STATE_C1: C | 1,
STATE_C2: C | 2,
STATE_C3: C | 4,
STATE_C4: C | 8,
// D
STATE_D: D
};
}();
// Set a state.
var x = State.STATE_A1; // Same as State.STATE_A | State.STATE_A1
// Determine if x has root state of A?
if(x & State.STATE_A == State.STATE_A) {
console.log("Root state is A.");
}
else {
console.log("Nope, not root state A.");
}
// Determine if x has sub-state A1?
if(x & State.STATE_A1 == State.STATE_A1) {
console.log("A with Substate 1");
}
Run Code Online (Sandbox Code Playgroud)
因此,前8位保留用于设置子状态.当然,只要根状态和子状态可以适合32位整数,你就可以增加它.如果您需要解释为什么/如何工作(按位运算符),请告诉我.
| 归档时间: |
|
| 查看次数: |
2115 次 |
| 最近记录: |