Подтвердить что ты не робот

Javascript Enum To Соответствующее значение строки

Итак, у меня есть это в 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 в зависимости от результата.

Теперь я хочу сопоставить это с строкой, чтобы в абзаце были показаны "Успех", "Ошибка" или "Ошибка идентификатора"

Я мог бы сделать это несколькими способами, которые я понял:

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 кажется wierd tho!)

Мой вопрос в том, как вы собираетесь сопоставлять значение перечислителя со строковым значением в Javascript?. Я думаю, что второй способ является самым разумным, но хотел бы, чтобы перечислитель был положительным для успехи и негативны для неудач. Мне также нравится идея первого, содержащего строки и значения в структуре объекта.

Любые идеи?

Спасибо!

Matt

<я > PS. Я собираюсь провести тестирование в Web Worker, чтобы страница не зависала, и результаты будут помещены в таблицу, а не абзац, как указано выше.

ПФС. Я новичок в программировании Javascript, но много делаю в ASM, C, С++, С#.

4b9b3361

Ответ 1

Вам действительно нужны числовые значения? Если нет, вы можете использовать что-то вроде этого:

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

Ответ 2

Не совсем оптимальный, но самый чистый вы можете получить без предварительной обработки обратного словаря (и, кроме того, это не должно быть слишком большой проблемой, если у вас есть только несколько значений перечисления):

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

Ответ 3

Вы всегда можете иметь значения как объекты определенного типа.

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() явно, большую часть времени.

Ответ 4

Если вы наберете текст, то у вас уже будет определение для перечисления. В противном случае вы можете напрямую использовать версию перечисления 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

Ответ 5

Это может отличаться от того, что вы хотите, но я хочу поделиться своим ответом. Это было вдохновлено решением @LukeHconst. Рассмотрите bookCategory ниже, вы заметите, что я использую число в качестве ключа.

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

Я написал bookCategory так, потому что, если вы используете столбец enum в MySQL. Например,

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

Вам понадобится какое-то преобразование в JavaScript. Итак, я придумал это, и его использование простое:

bookCategory[book.category]

Ответ 6

Лучший способ сделать это:

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

Почему нам нужно добавить freeze UserLevel является постоянным, но мы можем изменить значения внутри, поэтому freeze сделает его безопасным для изменений.