Javascript枚举到对应的字符串值

时间:2010-11-26 16:16:07

标签: javascript enums

所以我在我的页面的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#中做了很多。

9 个答案:

答案 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;
}