不知道這甚至可以做,但我會問反正:使用數組創建動態JavaScript對象樹?
假設,如果我有名字的數組:
['bob', 'sue', 'dan']
我想動態創建這些對象名稱:
bob.sue.dan = 5;
這可能嗎?
不知道這甚至可以做,但我會問反正:使用數組創建動態JavaScript對象樹?
假設,如果我有名字的數組:
['bob', 'sue', 'dan']
我想動態創建這些對象名稱:
bob.sue.dan = 5;
這可能嗎?
現在你走了,將保留現有的對象:
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;
};
例如,用法:
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);
是的,這是可能的。
可以在對象上定義新的屬性是這樣的:
var obj = {};
obj["bob"] = {};
obj["bob"]["sue"] = {};
obj["bob"]["sue"]["dan"] = 5;
所以,你也可以用屬性名稱的數組做到這一點;)
這不是動態創建的對象 – Teneff 2011-05-13 07:04:21
特別是因爲我不想打擾已經在其他層次結構中的任何其他屬性 – 2011-05-13 07:06:07
@Teneff我從來沒有說過它是一個動態創建的對象。我只向您展示了您可以通過字符串動態定義屬性的方式。這正是你需要的;)我認爲-1是不公平的...... – 2011-05-13 07:09:09
相信你能...
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;
}
}
如果我已經有了一些具有一些填充屬性的對象會發生什麼? – 2011-05-13 07:07:42
不要在數組中使用for..in,除非有很好的理由,並且已經保護了它們免受弱點影響。 – RobG 2011-05-13 07:11:34
然後,你可以這樣做:
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;
}
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);
我喜歡你的解決方案的優雅。有沒有一種方法可以編輯它以在函數本身中給出一個值? – 2011-05-13 07:54:24
例如:命名空間(名稱,分隔符,容器,值) – 2011-05-13 08:23:23
更新爲接受可選值參數:) – herostwist 2011-05-13 09:03:28