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

Converting enums to array of values (Putting all JSON values in an array)

我在javascript中使用这个方法枚举?在代码中创建枚举。

所以

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

现在的问题是,当我想在任何地方创建验证时,我必须这样做;

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

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

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

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


简单解决方案(ES6)

您可以这样使用Object.values

1
var valueArray = Object.values(types);

在线演示(小提琴)


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

1
2
3
4
5
6
7
function makeEnum(enumObject){
   var all = [];
   for(var key in enumObject){
      all.push(enumObject[key]);
   }
   enumObject.all = all;
}


1
2
3
4
5
6
7
8
9
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);

jsFoDel-demo


您可以将其转换为数组,或者只需迭代对象的属性(这也是您创建数组的方式):

1
2
3
4
5
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
}

为了完整起见,可以使用该方法创建数组,如下所示:

1
2
3
4
5
6
var arr = [];
for(var i in types){
    var type = types[i];
    arr.push(type);
}
//arr = [0, 1]

要使此功能可重用,可以创建一个助手函数:

1
2
3
4
5
6
7
8
function ObjectToValueArray(obj){
    var arr = [];
    for(var i in obj){
        var v = obj[i];
        arr.push(v);
    }
    return arr;
}

可以这样称呼:

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


榨汁(或包装).validate,使其接受types的含义为所有成员?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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);
}