不确定是否可以这样做,但无论如何我都会问:
假设我有一个名字数组:
['bob', 'sue', 'dan']
我想从这些名称中动态创建一个对象:
bob.sue.dan = 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);
答案 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);
答案 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;
所以你也可以用一组属性名来做;)