在javascript中将int转换为枚举

时间:2014-07-22 18:09:27

标签: javascript

如何在javascript中有效地将int转换为枚举?

说我有这个枚举

enuTable = // Table enum
{
    enuUnknown: 0,
    enuPerson: 1,
    enuItem: 2,
    enuSalary: 3,
    enuTax: 4,
    enuZip: 5,
    enuAddress: 6,
    enuLocation: 7,
    enuTasks: 8,

};

在部分代码中,我从AJAX调用中获取一个返回值,该调用是与上述表之一相对应的数字。

我可以编写一个转换值的开关,但是有一种更有效(简洁)的方式将int转换为枚举吗?一个原因是,我不想经常更改开关,以防我更改枚举。我想我可以使用带有枚举名称的数组并构造一个标识符来索引枚举,但是,每次枚举更改时我都需要更改数组。我想我正在寻找的是一种透明的方法,它不需要预先知道枚举。

4 个答案:

答案 0 :(得分:8)

喜欢这个

var keys = Object.keys(enuTable).sort(function(a, b){
    return enuTable[a] - enuTable[b];
}); //sorting is required since the order of keys is not guaranteed.

var getEnum = function(ordinal) {
    return keys[ordinal];
}

UPD:您可以使用

缺少某些序数值
var keys = Object.keys(enuTable).reduce(function(acc, key) {
    return acc[enuTable[key]] = key, acc;
}, {});

答案 1 :(得分:2)

一个选项如下:

 function toTableName(i) {
     for(var p in enuTable) {
         if(enuTable.hasOwnProperty(p) && enuTable[p] === i) {
              return p;
         }
     }
     throw new Error('that\'s no table...');
}

答案 2 :(得分:2)

首先,JavaScript没有C#内置的枚举。

因此,我相信如果您收到一个基于AJAX数字的标识符并且您想编写switch语句,则不需要强制Number在JavaScript中,因为您的开关将比较您的伪枚举属性值:

switch(ajaxNumber) {
   case enuTable.enuPerson: 
      break;
}

如果您正在寻找获取枚举值标签(例如enuPerson),则以下代码应该足够(请查看jsFiddle中的工作示例):

// We're going to implement a basic enumeration prototype to generalize
// what you're looking for so you may re-use this code anywhere!
function Enum(valueMap) {
    // We store the enumeration object
    this._valueMap = valueMap;
    this._valueToLabelMap = {};
    var that = this;

    // This will create an inverse map: values to labels
    Object.keys(valueMap).forEach(function (label) {
        that._valueToLabelMap[valueMap[label]] = label;
    });
}

Enum.prototype = {
    // Getting the whole label is as simple as accessing
    // the inverse map where values are the object properties!
    getLabel: function (value) {
        if (this._valueToLabelMap.hasOwnProperty(value)) {
            return this._valueToLabelMap[value];
        } else {
            throw Error("Enum instance has no defined '" + value + "' value");
        }
    }
};

var enuTable = new Enum({
    enuUnknown: 0,
    enuPerson: 1,
    enuItem: 2,
    enuSalary: 3,
    enuTax: 4,
    enuZip: 5,
    enuAddress: 6,
    enuLocation: 7,
    enuTasks: 8,
});

// Now, if we provide a number, the fancy Enum prototype will handle it
// so you're going to get the whole enumeration value label!
var taxLabel = enuTable.getLabel(45);

答案 3 :(得分:0)

我喜欢Yury Tarabanko的解决方案,但我花了一些时间来了解它的作用(包括阅读和理解reduce()。我不能评论你@YuryTarabanko,但你是怎么做的想出这个?

我想出的解决方案就是这个。你可以像Yury的解决方案一样访问它(keys [ajaxResponseNumber])。我用jsPerf对它进行了测试,这在Firefox中更快,但在这种情况下并不相关。

var keys = {}; for (var x in enuTable) { if (enuTable.hasOwnProperty(x)) { keys[enuTable[x]] = x; } }