web-dev-qa-db-ja.com

対応する文字列値へのJavascript列挙

だから私は私のページのjavascriptにこれを持っています:

_var TEST_ERROR  = {
        'SUCCESS'   :   0,
        'FAIL'      :   -1,
        'ID_ERROR'  :   -2
      };
_

そして、次のようにページ内の関数でテストを実行します。

_function test()
{
    // Get the paragraph from the DOM
    var testResultParagraph = document.getElementById('testResult');

    // Check the paragraph is valid
    if(!testResultBox)
    {
        // Update the web page
        testResultParagraph.value = TEST_ERROR.ID_ERROR;
        return TEST_ERROR.ID_ERROR;
    }

    // Something to store the results
    var testResult = TEST_ERROR.SUCCESS;

    // Test the calculation
    testResult = testCalculate()

    // Update the web page
    testResultParagraph.value = testResult;

    // The test succeeded
    return TEST_ERROR.SUCCESS;
}
_

testCalculate()の結果と段落の値は、結果に応じて0、-1、-2のいずれかになります。

次に、これを文字列にマッピングして、段落に「成功」​​、「失敗」、または「IDエラー」が表示されるようにします

私が考えたいくつかの方法でこれを行うことができました:

_var TEST_ERROR  = {
        'SUCCESS'   :   {VALUE : 0 , STRING: 'Success' },
        'FAIL'      :   {VALUE : -1, STRING: 'Fail'    },
        'ID_ERROR'  :   {VALUE : -2, STRING: 'Id Error'},
      };
_

列挙型ドットアクセサーを変更する必要がある、または

_var TEST_ERROR  = {
        'SUCCESS'   :   0,
        'FAIL'      :   1,
        'ID_ERROR'  :   2
      };

var TEST_STRING = [
        'Success',
        'Fail',
        'ID Error'
      ];
_

ロジックを変更する必要があります(_result > TEST_ERROR.SUCCESS_はおかしいと思われます!)

私の質問は、Javascriptで列挙子の値を文字列値にどのようにマッピングしますか? 2番目の方法が最も賢明だと思いますが、成功のために列挙子を肯定的で否定的にしたいと思います失敗します。オブジェクト構造に文字列と値を含む最初のアイデアも気に入っています。

何か案は?

ありがとう!

マット

PS。ページがハングせず、結果が上記のような段落ではなくテーブルに配置されるように、Web Workerでテストを実行します。

PPS。私はJavascriptプログラミングは初めてですが、ASM、C、C++、C#で多くのことを行います。

25
Matt Clarkson

実際に数値が必要ですか?そうでない場合は、次のようなものを使用できます。

var TEST_ERROR  = {
    SUCCESS  : 'Success',
    FAIL     : 'Fail',
    ID_ERROR : 'ID Error'
};
23
LukeH

最適ではありませんが、逆辞書を事前計算せずに取得できる最もクリーンなものです(さらに、列挙値が少数しかない場合、これはあまり問題になりません)。

function string_of_enum(enum,value) 
{
  for (var k in enum) if (enum[k] == value) return k;
  return null;
}
24
Victor Nicollet

値は常に特定のタイプのオブジェクトにすることができます。

_var TEST_ERROR = (function() {
  function ErrorValue(value, friendly) {
    this.value = value;
    this.friendly = friendly;
  }
  ErrorValue.prototype = {
    toString: function() { return this.friendly; },
    valueOf: function() { return this.value; }
  };
  return {
    'SUCCESS': new ErrorValue(0, 'Success'),
    'FAIL': new ErrorValue(1, 'Fail'),
    'ID_ERROR': new ErrorValue(2, 'ID error')
  };
})();
_

そのタイプの値を取得したら:

_var err = testFunction(whatever);
_

で文字列値を取得できます

_alert(err.toString());
_

実際、ほとんどの場合、.toString()を明示的に呼び出す必要さえありません。

3
Pointy

TypeScriptの場合は、列挙型の定義が既にあります。それ以外の場合は、enumのJSバージョンを直接使用できます。

var Status;
(function (Status) {
    Status[Status["New"] = 0] = "New";
    Status[Status["Submitted"] = 1] = "Submitted";
    Status[Status["Approved"] = 2] = "Approved";
    Status[Status["Rejected"] = 3] = "Rejected";
})(Status || (Status = {}));
var snew = Status.New;
console.log(snew); //This is the number
console.log(Status[snew]); //This is the string
1

最善の方法は次のとおりです。

export const UserLevel = Object.freeze({
   BABY: 1,
   CHILED: 2
});

凍結UserLevelを追加する必要がある理由はconstですが、内部の値を変更できるため、凍結により変更に対して安全になります。

0
Idan

これはあなたが望むものとは異なるかもしれませんが、私の答えを共有したいと思います。これは@LukeHconstソリューションに触発されました。以下のbookCategoryを検討してください。キーとして数値を使用していることに気づくでしょう。

const bookCategory = {
    "0": "Biography",
    "1": "Fiction",
    "2": "History",
    "3": "Mystery",
    "4": "Suspense",
    "5": "Thriller"
};

MySQLでenumカラムを使用している場合は、このようにbookCategoryを作成しました。例えば、

category ENUM ('0', '1', '2', '3', '4', '5')

JavaScriptで何らかの変換が必要になります。だから私はこれを思いつき、使い方は次のように簡単です:

bookCategory[book.category]
0
Storage Lenovo