所以我在我的页面的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中的字符串值?我认为第二种方式是最明智的,但希望枚举器为正面成功和否定失败。我也喜欢第一个包含对象结构中的字符串和值的想法。
有什么想法吗?
谢谢!
马特
PS。我将在Web Worker中进行测试,因此页面不会挂起,结果将被放入表中,而不是像上面那样的段落。
PPS。我对Javascript编程很陌生,但在ASM,C,C ++,C#中做了很多。
答案 0 :(得分:23)
不是最优,但是在没有预先计算反向字典的情况下你可以得到最干净的(此外,如果你只有几个枚举值,这不应该是一个问题):
function string_of_enum(enum,value)
{
for (var k in enum) if (enum[k] == value) return k;
return null;
}
答案 1 :(得分:22)
你真的需要数值吗?如果没有,那么你可以使用这样的东西:
var TEST_ERROR = {
SUCCESS : 'Success',
FAIL : 'Fail',
ID_ERROR : 'ID Error'
};
答案 2 :(得分: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()
。
答案 3 :(得分:2)
对于TypeScript,有一个更简单的解决方案 (如果您坚持使用JS,请忽略我的回答):
export enum Direction {
none,
left = 1,
right = 2,
top = 4,
bottom = 8
}
export namespace Direction {
export function toString(dir: Direction): string {
return Direction[dir];
}
export function fromString(dir: string): Direction {
return (Direction as any)[dir];
}
}
console.log("Direction.toString(Direction.top) = " + Direction.toString(Direction.top));
// Direction.toString(Direction.top) = top
console.log('Direction.fromString("top") = ' + Direction.fromString("top"));
// Direction.fromString("top") = 4
console.log('Direction.fromString("xxx") = ' + Direction.fromString("unknown"));
// Direction.fromString("xxx") = undefined
因为枚举类型被编译成一个对象(字典)。 您不需要循环即可找到相应的值。
enum Direction {
left,
right
}
被编译为:
{
left: 0
right: 1
0: "left",
1: "right"
}
答案 4 :(得分:0)
如果您是打字稿,那么您已经有了枚举的定义。否则,您可以直接使用枚举的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 :(得分:0)
这可能与您想要的不同,但是我想分享我的答案。这是受@LukeHconst解决方案启发的。考虑下面的bookCategory
,您会发现我使用数字作为密钥。
const bookCategory = {
"0": "Biography",
"1": "Fiction",
"2": "History",
"3": "Mystery",
"4": "Suspense",
"5": "Thriller"
};
我之所以这样写bookCategory
是因为如果您在MySQL中使用枚举列。例如,
category ENUM ('0', '1', '2', '3', '4', '5')
您需要使用JavaScript进行某种转换。所以我想到了这个,用法很简单:
bookCategory[book.category]
答案 6 :(得分:0)
最好的方法是:
export const UserLevel = Object.freeze({
BABY: 1,
CHILED: 2
});
为什么我们需要添加冻结UserLevel是const,但是我们可以更改其中的值,因此冻结将使其更安全。
答案 7 :(得分:0)
我更喜欢下面的方法。
enum ColorEnum {
Red,
Green,
Blue
}
console.log(ColorEnum[ColorEnum.Red]);
答案 8 :(得分:-1)
基于Victor的出色答案,因此可以在TypeScript中使用:
enumToStr(enumeration: any, value: any): string {
for (var k in enumeration)
if (enumeration[k] == value)
return <string>k;
return null;
}