Создание динамического дерева объектов Javascript с использованием массива? - PullRequest
1 голос
/ 13 мая 2011

Не уверен, что это вообще можно сделать, но я все равно спрошу:

Предположим, у меня есть массив имен:

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

И я хочу динамически создать объект из этих имен:

bob.sue.dan = 5;

Возможно ли это?

Ответы [ 5 ]

3 голосов
/ 13 мая 2011

Вот, пожалуйста, сохраните существующие объекты:

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);

См. Рабочий пример: http://jsfiddle.net/herostwist/hu6j9/

2 голосов
/ 13 мая 2011
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/

2 голосов
/ 13 мая 2011

Тогда вы можете сделать:

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;
}
0 голосов
/ 13 мая 2011

уверен, что вы можете ...

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;
    }
}
0 голосов
/ 13 мая 2011

Да, это возможно.

Вы можете определить новые свойства объекта следующим образом:

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

Таким образом, вы также можете сделать это с массивом имен свойств;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...