不使用eval创建未知大小的对象

时间:2011-03-06 22:56:03

标签: javascript arrays performance multidimensional-array eval

我目前正在使用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?'[]':'{}') + ';');
          }
        }
      }

2 个答案:

答案 0 :(得分:2)

怎么样

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”标志似乎没有任何意义,因为你可能总是使用字符串作为键。

答案 1 :(得分:0)

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

      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”作为函数外部的变量,包含对象的级别。在没有result["field"]["name"]["first"] = value["field"]字段存在或定义为对象的情况下执行["name"]会抛出错误并停止执行,这就是为什么我要预先创建对象变量,作为数组或对象。

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