将枚举转换为值数组(将所有JSON值放入数组中)

40

我使用这个方法在JavaScript中创建枚举?来在我们的代码中创建枚举。

所以


var types = {
  "WHITE" : 0,
  "BLACK" : 1
}

现在的问题是,无论我想在哪里创建验证,我都必须这样做;

model.validate("typesColumn", [ types.WHITE, types.BLACK ]);

现在有没有一种方法可以将“types”中的值简单地转换为数组,这样我就不必列出枚举类型中的所有值了?

model.validate("typesColumn", types.ValuesInArray]);

编辑: 我创建了一个非常简单的枚举库来生成简单的枚举npm --save-dev install simple-enum (https://www.npmjs.com/package/simple-enum)

5个回答

114

简单解决方案(ES6)

您可以像这样使用Object.values

var valueArray = Object.values(types);

在线演示(JSFiddle)


如果枚举是一个字符串(例如,枚举 { "Hello", "Goodbye" }),那么Object.keys(enum)就可以使用。 - undefined

16

我会将地图转换成数组并将其存储为types.all。 您可以创建一个自动执行此操作的方法:

function makeEnum(enumObject){
   var all = [];
   for(var key in enumObject){
      all.push(enumObject[key]);
   }
   enumObject.all = all;
}

我认为这是最好的解决方案。我可以在声明枚举时调用makeEnum,然后只需调用.all即可。 - Tolga E
这个代码是否实现了所需的功能?毕竟,all 应该是一个属性名称的数组,例如 ['WHITE', 'BLACK'],而不是值的数组(这是 OP 请求的)。另外,enum 是一个保留字!为什么会被接受?... - musefan
我猜测 OP 没有仔细研究实现细节,这确实是不正确的。我会为其他用户进行更正,感谢您的评论。 - Yann

10
var types = {
  "WHITE" : 0,
  "BLACK" : 1
}
var typeArray = Object.keys(types).map(function(type) {
    return types[type];
});
//typeArray [0,1]

model.validate("typesColumn", typeArray);

jsFiddle Demo


3
对于像 node.js 这样的现代环境,使用 Object.keys 得到一个对象的所有键是现代 JavaScript 代码的好选择! - Mattias Buelens
+1,但我更喜欢将keysmap重构为一个通用函数values(obj),然后只需验证“typesColumn”的值即可validate("typesColumn", values(types)) - georg

2
你可以将其转换为数组,或者只需迭代对象的属性(这也是创建数组的方式):
for(var i in types){
    var type = types[i];
    //in the first iteration: i = "WHITE", type = 0
    //in the second iteration: i = "BLACK", type = 1
}

为了完整性,您可以按照以下方法创建该数组:
var arr = [];
for(var i in types){
    var type = types[i];
    arr.push(type);
}
//arr = [0, 1]

为了使这段代码可以重用,你可以创建一个辅助函数:
function ObjectToValueArray(obj){
    var arr = [];
    for(var i in obj){
        var v = obj[i];
        arr.push(v);
    }
    return arr;
}

可以这样调用:

model.validate("typesColumn", ObjectToValueArray(types));

我知道我可以将它们转换,但由于它们在各个地方都被使用,我正在寻找一种一行解决方案。需要非常简单且支持此功能的东西。 - Tolga E
1
创建一个辅助函数并重复使用它。 - musefan

1
.validate接受types作为表示所有成员的意思,来增强(或包装)它。
var types = {
  "WHITE" : 0,
  "BLACK" : 1,
  "RED"   : 200
}

validate("foo", types.WHITE); // 0
validate("foo", [types.WHITE, types.BLACK]); // 0,1 
validate("foo", types); // 0,1,200

function validate(foo, values) { 
    var arr = [];
    switch (typeof values) {
        case "number":
            arr.push(values);
            break;
        case "object":
            if (values instanceof Array) 
                arr = values;
            else {
                for (var k in values)
                    arr.push(values[k]);
            }
            break;
    }
    alert(arr);
}

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