将JavaScript枚举键字符串转换为值

12

在JavaScript代码中,我定义了以下枚举:

MyMessageIds = {
    UndefinedId : 0,
    FilenameId : 1,
    BuildFileId : 2,
    MovementArgsId : 3,
    MoveId : 4,
    ExecuteCommandId : 5
}
在JavaScript函数中,我想能够提供枚举键的字符串表示(即“MoveId”),并返回其整数值4。那么我该怎么做?

也许我没有完全理解你的问题,但是你只需要使用 MyMessageIds.MoveId(或者替代地使用 MyMessageIds["MoveId"])来获取整数值。 - jeffjenx
MyMessageIds ["MoveId"] --- 这就是我正在寻找的...谢谢。 - chuckp
1
我该如何反向操作?我有数字,想要名称? - SomeRandomDeveloper
2个回答

25

只需使用方括号表示法:

var MyMessageIds = {
    UndefinedId : 0,
    FilenameId : 1,
    BuildFileId : 2,
    MovementArgsId : 3,
    MoveId : 4,
    ExecuteCommandId : 5
};

function getValue(key) {
    return MyMessageIds[key];
}

此外,您应该通过应用 Object.freeze() 来保护“事实上”的枚举免受更改的影响。 - Stacky

5
你可以创建一些实用方法,这些方法接收一个对象(枚举),该对象确定如何获取键/值。

var MyMessageIds = {
    UndefinedId : 0,
    FilenameId : 1,
    BuildFileId : 2,
    MovementArgsId : 3,
    MoveId : 4,
    ExecuteCommandId : 5
}

function getEnumKeys(enumType) {
  return Object.keys(MyMessageIds);
}

function getEnumValues(enumType) {
  return getEnumKeys(enumType).map(function(key) {
    return enumType[key];
  });
}

function getEnumValue(enumType, key) {
  return enumType[getEnumKeys(enumType).filter(function(k) {
    return key === k;
  }).pop() || ''];
}

document.body.innerHTML = '<pre>' + JSON.stringify({
  'Enum Keys' : getEnumKeys(MyMessageIds),
  'Enum Vals' : getEnumValues(MyMessageIds),
  'Example' : {
    'MoveId' : getEnumValue(MyMessageIds, 'MoveId')
  }
}, null, 4) + '</pre>';

您还可以创建自己的类对象来表示枚举,并具有可重用的方法。

function Enum() {
  this.self = arguments[0];
}
Enum.prototype = {
  keys : function() {
    return Object.keys(this.self);
  },
  values : function() {
    var me = this;
    return this.keys(this.self).map(function(key) {
      return me.self[key];
    });
  },
  getValueByName : function(key) {
    return this.self[this.keys(this.self).filter(function(k) {
      return key === k;
    }).pop() || ''];
  },
  getNameByValue : function(value) {
    var me = this;
    return this.keys(this.self).filter(function(k) {
      return me.self[k] === value;
    }).pop() || null;
  }
};

var MyMessageIds = new Enum({
    UndefinedId : 0,
    FilenameId : 1,
    BuildFileId : 2,
    MovementArgsId : 3,
    MoveId : 4,
    ExecuteCommandId : 5
});

document.body.innerHTML = '<pre>' + JSON.stringify({
  'Enum Keys' : MyMessageIds.keys(),
  'Enum Vals' : MyMessageIds.values(),
  'Example' : {
    'MoveId' : MyMessageIds.getValueByName('MoveId'),
    'Val(3)' : MyMessageIds.getNameByValue(3)
  }
}, null, 4) + '</pre>';


它很好用。有没有办法获取枚举值作为MyMessageIds.MoveId? - sandeep.gosavi
@sandeep.gosavi 我认为'MyMessageIds.getValueByName('MoveId')'可以给你想要的结果。你不想使用方法吗? - Atakan Savaş

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接