枚举中的Javascript枚举

aeq*_*aeq 9 javascript enums

我在javascript中有以下"Enum"来指示我的应用程序的状态:

var State = {
   STATE_A: 0,
   STATE_B: 1,
   STATE_C: 2
   //...
}
Run Code Online (Sandbox Code Playgroud)

现在,我希望每个州都有一个"子国家".例如,STATE_B可能在... STATE_B1STATE_B2...

什么是最好的结构方式?我会以某种方式在"枚举"中嵌入State"枚举"吗?谢谢

如果有一个更好的方法来完全构建这个(除了枚举)我都是耳朵.基本上我需要能够设置和检查我的应用程序的状态,并且每个状态都可以(但不是必需)附加一个可以设置和检查的子状态.如果解决方案允许我超过1级嵌套深度,那就更好了.

Nic*_*eri 6

你在做什么并不是真正的枚举。您正在使用本机 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".


The*_*Sky 5

如果需要,您可以使用某种位字段:

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位整数,你就可以增加它.如果您需要解释为什么/如何工作(按位运算符),请告诉我.