使用数组创建动态Javascript对象树?

时间:2011-05-13 06:47:27

标签: javascript arrays object dynamic

不确定是否可以这样做,但无论如何我都会问:

假设我有一个名字数组:

['bob', 'sue', 'dan']

我想从这些名称中动态创建一个对象:

bob.sue.dan = 5;

有可能吗?

5 个答案:

答案 0 :(得分:3)

在这里,您将保留现有对象:

var namespace = function(name, separator, container){
  var ns = name.split(separator || '.'),
    o = container || window,
    i,
    len;
  for(i = 0, len = ns.length; i < len; i++){
    o = o[ns[i]] = o[ns[i]] || {};
  }
  return o;
};

e.g。用法:

namespace("com.example.namespace");
com.example.namespace.test = function(){
  alert("In namespaced function.");
};

或使用数组的示例。

var ns = ['bob', 'sue', 'dan'];
namespace(ns.join('.'));
bob.sue.dan.foobar = true;

或扩展现有对象:

var bob = {}
namespace("foo.bar",".",bob);
bob.foo.bar = true;

编辑:根据要求更新:

var namespace = function(name, separator, container, val){
  var ns = name.split(separator || '.'),
    o = container || window, i, len;
  for(i = 0, len = ns.length; i < len; i++){
      var v = (i==len-1 && val) ? val : {};
      o = o[ns[i]] = o[ns[i]] || v;
  }
  return o;
};

namespace("bob.sue.dan",null,null,5);
alert(bob.sue.dan);

参见工作示例:http://jsfiddle.net/herostwist/hu6j9/

答案 1 :(得分:2)

然后你可以这样做:

function makeOjectTree(propNames) {
  var name;
  var o = {};
  var result = o;

  for (var i=0, iLen=propNames.length; i<iLen; i++) {
    name = propNames[i];

    if (!o[name]) {
      o[name] = {};
      o = o[name];
    }
  }
  return result;
}

答案 2 :(得分:2)

var names = ['bob', 'sue', 'dan'];
var objs = [];

for(var i=0; i<names.length; i++) {
  objs.push(names[i]);
  var val = (i==names.length-1) ? "5" : "{}";
  eval(objs.join(".") + " = " + val);
}

alert(bob.sue.dan);

演示:http://jsfiddle.net/EpZm2/1/

答案 3 :(得分:0)

确定你可以......

var obj = 5;
var yourarray = ['bob', 'sue', 'dan'];

yourarray = yourarray.reverse();
for(e in yourarray) {
    var tmpobj = obj;
    obj = new Object();
    obj[yourarray[e]] = tmpobj;

    // if you already have an object
    if (e+1 == yourarray.length) {
        your_current_existing_object[yourarray[e]] = tmpobj;
    }
}

答案 4 :(得分:-2)

是的,这是可能的。

您可以通过以下方式在对象上定义新属性:

var obj = {};
obj["bob"] = {};
obj["bob"]["sue"] = {};
obj["bob"]["sue"]["dan"] = 5;

所以你也可以用一组属性名来做;)