Ответ 1
Вам действительно нужны числовые значения? Если нет, вы можете использовать что-то вроде этого:
var TEST_ERROR = {
SUCCESS : 'Success',
FAIL : 'Fail',
ID_ERROR : 'ID Error'
};
Итак, у меня есть это в 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, С++, С#.
Вам действительно нужны числовые значения? Если нет, вы можете использовать что-то вроде этого:
var TEST_ERROR = {
SUCCESS : 'Success',
FAIL : 'Fail',
ID_ERROR : 'ID Error'
};
Не совсем оптимальный, но самый чистый вы можете получить без предварительной обработки обратного словаря (и, кроме того, это не должно быть слишком большой проблемой, если у вас есть только несколько значений перечисления):
function string_of_enum(enum,value)
{
for (var k in enum) if (enum[k] == value) return k;
return null;
}
Вы всегда можете иметь значения как объекты определенного типа.
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()
явно, большую часть времени.
Если вы наберете текст, то у вас уже будет определение для перечисления. В противном случае вы можете напрямую использовать версию перечисления 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
Это может отличаться от того, что вы хотите, но я хочу поделиться своим ответом. Это было вдохновлено решением @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]
Лучший способ сделать это:
export const UserLevel = Object.freeze({
BABY: 1,
CHILED: 2
});
Почему нам нужно добавить freeze UserLevel является постоянным, но мы можем изменить значения внутри, поэтому freeze сделает его безопасным для изменений.