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

问题描述 投票:0回答:6

我使用这个方法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

javascript json node.js enums
6个回答
120
投票

简单的解决方案(ES6)

您可以像这样使用

Object.values

var valueArray = Object.values(types);

在线演示(小提琴)


17
投票

我会将地图转换为数组并将其存储为

types.all
。 您可以创建一个自动执行此操作的方法:

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

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 演示


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));

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);
}

0
投票

用于创建普通枚举的 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],
] }
  • 还有其他方法可以生成和过滤条目列表,但我选择了我认为最清晰的代码方式。
© www.soinside.com 2019 - 2024. All rights reserved.