如何动态创建复杂/嵌套的js对象?

时间:2015-07-13 18:36:25

标签: javascript javascript-objects

我有以下数据。

var data =" a.b.c.d&#34 ;; //只是一个例子,但可以更深入。

  1. 嵌套结构作为字符串来创建a.b.c.n
  2. 现在我想从这个数据中创建一个js对象..

    {
      "a":{
         "b":{
            "c":{
                and so on till the given depth.  
              }
           }
      }
    
    }
    

    我尝试了什么

    function createHierarchy( obj, group, i){
    
        if(i === group.length){
            return obj;
        }
        else{
            if(obj[group[i]] === undefined)
            {
                obj[group[i]] = new Object();
    
            }
    
            createHierarchy(obj[group[i]], group, ++i); 
        }
    }
    

    问题

    这个函数返回未定义,因为我在每次递归调用中发送新创建的子对象,并且由于新创建的对象是{},因此最终结果是未定义的。

    更新

    我想只在不存在的情况下创建对象。例如:如果已经存在,则插入一个值。 生病了。

    所以这就是我在@Tuelle的答案中添加的内容。

    if(temp[array[i]] === undefined)
                temp = temp[array[i]] = {};
            else
                temp = temp[array[i]][name] = value;
    

    如此善意地建议出路。

3 个答案:

答案 0 :(得分:6)

var data = "a.b.c.n";
var array = data.split(".");

var result = {};
var temp = result;
for(var i = 0; i < array.length; i++) {
    temp = temp[array[i]] = {};
}

console.log(result);

答案 1 :(得分:2)

function BuildObj(string) {
  var obj = {};
  var params = string.split(".");
  for(var i=params.length-1;i>=0;i--) {
    last = obj;
    obj = {};
    obj[params[i]] = last;
  }
  return obj;
}

所以,

buildObj("a.b.c.d");

给出:

{
  "a": {
    "b": {
      "c": {
        "d": {}
      }
    }
 }

答案 2 :(得分:1)

var data = "a.b.c.n";
var array = data.split(".");

var last = {};
var temp = {};
for (var i = array.length - 1; i >= 0; i--) {
  temp = {};
  temp[array[i]] = last;
  last = temp;
}

console.log(last);

https://jsfiddle.net/qo21eh84/2/

相关问题