【问题标题】:Converting enums to array of values (Putting all JSON values in an array)将枚举转换为值数组(将所有 JSON 值放入数组中)
【发布时间】:2013-08-11 14:52:49
【问题描述】:

我使用这种方法Enums in 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


    【解决方案1】:

    简单的解决方案(ES6)

    你可以像这样使用Object.values

    var valueArray = Object.values(types);
    

    Online demo (fiddle)

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我认为这是最好的解决方案。我可以在声明枚举时调用 makeEnum 然后就可以调用 .all
      • 这甚至可以满足要求吗?在这之后all 肯定会是和属性名称数组吗?像['WHITE', 'BLACK'] 而不是一个值数组(OP 已请求)。另外,enum 是保留字!为什么这被接受了?...
      • 我猜 OP 在没有研究确实不正确的确切实现的情况下接受了这个想法。我会为其他用户更正它,感谢您的评论。
      【解决方案3】:
      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

      【讨论】:

      • +1 表示Object.keys。用于现代环境的现代 JavaScript 代码,例如 node.js!
      • +1,但我宁愿将keys + map 重构为通用函数values(obj),然后简单地重构validate("typesColumn", values(types))
      【解决方案4】:

      你可以将它转换成一个数组,或者你可以只迭代对象的属性(这就是你创建数组的方式):

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

      【讨论】:

      • 我知道我可以转换这些,但由于这些用于不同的地方,我正在寻找一种单行解决方案。支持此功能的非常简单的东西
      • 创建一个辅助函数并重复使用它
      【解决方案5】:

      榨汁(或包装).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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-07
        • 2014-09-27
        • 2013-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-04
        • 1970-01-01
        相关资源
        最近更新 更多