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にまったく慣れていないので、言及したobjcなどの他の言語と同じようにjsでenumを使用する方法があるかどうかを本当に知りたいと思っています。

ありがとう :)

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

私が正しく理解している場合、あなたの目標は、状態を数値で識別して、それらを列挙型で比較できるようにすることです。

最初 に、私があなたが意味したと思うことの実用的なフィドルがあります。

一般的な列挙型については、私が使用する素晴らしいトリックを次に示します。

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 に答える
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 に答える