我使用这个方法JavaScript中的枚举?在我们的代码中创建枚举..
那么
var types = {
"WHITE" : 0,
"BLACK" : 1
}
现在的问题是,当我想在任何地方创建验证时,我必须这样做;
model.validate("typesColumn", [ types.WHITE, types.BLACK ]);
现在有没有一种方法可以简单地将类型中的值转换为数组,这样我就不必列出枚举的所有值?
model.validate("typesColumn", types.ValuesInArray]);
编辑:我创建了一个非常简单的枚举库来生成简单的枚举
npm --save-dev install simple-enum
(https://www.npmjs.com/package/simple-enum)
我会将地图转换为数组并将其存储为
types.all
。
您可以创建一个自动执行此操作的方法:
function makeEnum(enumObject){
var all = [];
for(var key in enumObject){
all.push(enumObject[key]);
}
enumObject.all = all;
}
var types = {
"WHITE" : 0,
"BLACK" : 1
}
var typeArray = Object.keys(types).map(function(type) {
return types[type];
});
//typeArray [0,1]
model.validate("typesColumn", typeArray);
您可以将其转换为数组,或者您可以只迭代对象的属性(这就是您创建数组的方式):
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));
榨汁(或包裹)
.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);
}
用于创建普通枚举的 ES6 类:
class Colors {
static get WHITE() { return 0 }
static get BLACK() { return 1 }
// generate the list of entries dynamically
static get entries() {
return Object.entries(Object.getOwnPropertyDescriptors(this))
.filter(([key]) => (key === key.toUpperCase()))
.map(([key, properties]) => ([key, properties.get()]))
}
}
console.log(Colors.WHITE, Colors.BLACK, Colors.entries)
有关上述工作原理的一些注意事项:
static
关键字意味着属性绑定到类对象本身而不是new
实例,因此可以直接调用它们// maintain the list of enum entries as an array
static get entries() { return [
['WHITE', Colors.WHITE],
['BLACK', Colors.BLACK],
] }