开发者

Creating objects of unknown size NOT using eval

I'm currently using javascript eval() to check and create a multidimensional object that I have no idea of the depth.

Basically, I want to know if there's any way to create this multi-depth object. The object can be as deep as result['one']['two']['three']['four']['five']['six']['seven']. I know there are cases where using eval() is perfectly fine, but I'm also worried about performance. I thought about referencing each depth to a new variable, but I don't know how to do pointers in 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?'[]':'{}') + ';');
          }
        }
      }


How about

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

I don't see what "eval()" has to do with this at all; there's no reason to "initialize" such an object. Just create them.

If you wanted to write a function with an API like you've got (for reasons I don't understand), you could do this:

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

There doesn't seem to be any point to the "create_array" flag, since you're presumably always using strings for keys.


Never mind, found my way in. I used a recursive function to ensure that the object was created properly.

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

being variable "field" a variable outside the function, that contained the levels of the object. doing result["field"]["name"]["first"] = value without the ["field"] or ["name"] field existing or defined as an object, would throw an error and stop execution, that's why I'm pre-creating the object variable, either as an array or object.

I couldn't find another option for the second eval() though. There's no way to provide a way to access multiple properties on an object without knowing the depth.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜