【问题标题】:Creating objects of unknown size NOT using eval不使用 eval 创建大小未知的对象
【发布时间】:2011-03-06 22:56:03
【问题描述】:

我目前正在使用 javascript eval() 来检查和创建一个我不知道深度的多维对象。

基本上,我想知道是否有任何方法可以创建这个多深度对象。对象可以深至result['one']['two']['three']['four']['five']['six']['seven']。我知道在某些情况下使用 eval() 非常好,但我也担心性能。我想过将每个深度引用到一个新变量,但我不知道如何在 Javascript 中做指针

      create = function(fields, create_array){
        var field;

        for (j = 0; j < len; j++){
          field = fields.slice(0, j).join('');
          if (field){
            // is there any way to do this without eval?
            eval('if (typeof result' + field + ' == "undefined" || !result' + field + ') result' + field + ' = ' + (create_array?'[]':'{}') + ';');
          }
        }
      }

【问题讨论】:

  • 输入是输入名称和值的数组,例如 &lt;input name="food[]" type="checkbox"&gt;&lt;input type="text" name="field[name][first]"&gt; 用于组合对象以使用 JSON 通过 AJAX 发送。

标签: javascript arrays performance multidimensional-array eval


【解决方案1】:

怎么样

var deep = { one: { two: { three: { four: { five: { six: { seven: 'peek-a-boo!' }}}}}}};

我根本看不出“eval()”与此有什么关系;没有理由“初始化”这样的对象。只需创建它们。

如果你想用你所拥有的 API 编写一个函数(出于我不明白的原因),你可以这样做:

function create(fields, create_array) {
  var rv = create_array ? [] : {}, o = rv;

  for (var i = 0; i < fields.length; ++i) {
    o = o[fields[i]] = create_array ? [] : {};
  }

  return rv;
}

“create_array”标志似乎没有任何意义,因为您可能总是使用字符串作为键。

【讨论】:

    【解决方案2】:

    没关系,我找到了方法。我使用递归函数来确保对象被正确创建。

          create = function(create_array, res, path){
            var field = fields.shift();
    
            if (field){ 
              if (typeof res[field] == "undefined" || !res[field]) res[field] = (create_array?[]:{});
              path.push('["' + field + '"]');
              create(create_array, res[field], path);
            }
          }
    
          var result = {}, strpath = [], fields[];
          create(true, result, strpath);
          eval('result' + strpath.join('') + ' = value;');
    

    作为变量“字段”是函数外部的变量,包含对象的级别。在没有 ["field"]["name"] 字段存在或定义为对象的情况下执行 result["field"]["name"]["first"] = value 会引发错误并停止执行,这就是我将对象变量预先创建为数组或对象的原因。

    我找不到第二个 eval() 的另一个选项。在不知道深度的情况下,无法提供访问对象多个属性的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多