Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用数组创建动态Javascript对象树?_Javascript_Arrays_Object_Dynamic - Fatal编程技术网

使用数组创建动态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);