使用数组创建动态Javascript对象树?
我不确定这是否可以做到,但我还是要问: 假设我有一个名称数组:使用数组创建动态Javascript对象树?,javascript,arrays,object,dynamic,Javascript,Arrays,Object,Dynamic,我不确定这是否可以做到,但我还是要问: 假设我有一个名称数组: ['bob','sue','dan'] 我想根据这些名称动态创建一个对象: bob.sue.dan=5 可能吗?是的,这是可能的 可以通过以下方式定义对象的新特性: var obj = {}; obj["bob"] = {}; obj["bob"]["sue"] = {}; obj["bob"]["sue"]["dan"] = 5; 因此,您还可以使用属性名称数组来执行此操作;) 当然可以 var obj = 5; var you
['bob','sue','dan']
我想根据这些名称动态创建一个对象:
bob.sue.dan=5代码>
可能吗?是的,这是可能的
可以通过以下方式定义对象的新特性:
var obj = {};
obj["bob"] = {};
obj["bob"]["sue"] = {};
obj["bob"]["sue"]["dan"] = 5;
因此,您还可以使用属性名称数组来执行此操作;) 当然可以
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;
}
}
然后你可以做:
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;
}
函数makeObjectTree(propNames){
变量名;
var o={};
var结果=o;
对于(var i=0,iLen=propNames.length;i在这里,将保留现有对象:
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;
};
或者使用数组作为示例
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 namespace=function(名称、分隔符、容器、val){
var ns=name.split(分隔符| |'),
o=容器| |窗口,i,len;
对于(i=0,len=ns.length;i
参见工作示例:var name=['bob','sue','dan'];
var objs=[];
对于(var i=0;它不是动态创建的object,特别是因为我不想干扰其他级别中已经存在的任何其他属性structure@Teneff我从来没有说过它是一个动态创建的对象。我只是向您展示了通过字符串动态定义属性的方法。这正是您需要的;)我认为-1是不公平的…如果我已经有了一个具有一些填充属性的对象,会发生什么情况?除非有很好的理由,并且您已经避免了这些缺点,否则不要将..用于数组中。我非常喜欢您的解决方案的优雅。是否有方法编辑它以在函数本身中提供值?例如:命名空间(名称、分隔符、容器、值)谢谢。虽然不能100%确定它是如何工作的,但它确实工作得很好。评论可能太晚了,但如果在WebWorker中使用此方法,我们需要稍微更改与容器相关的函数。从|
语句中删除窗口
,并在需要时添加以下行(typeof window!=“undefined”){o=window;}否则如果(typeof self!=“undefined”){o=self;}
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 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);