2013-06-24 36 views
1
建立嵌套属性
var keys1 = ["foo", "moreFoo"], 
value1 = "bar", 
keys2 = ["foo", "ultraFoo"], 
value2 = "bigBar"; 

我想使这会为我建造对象的函数:如何从关键字符串

object { 
foo : {moreFoo: "bar", ultraFoo: "bigBar"} 
} 

我认为把我的阵列中的每一个,并执行以下操作:

function recursiveObjectBuild(object, keys, value) { 
    var index = 0; 
    function loop(object, index) { 
     var key = keys[index]; 
     //Property exists, go into it 
     if (key in object) { 
      loop(object[key], ++index); 
     //Property doesn't exist, create it and go into it 
     } else if (index < keys.length-1) { 
      object[key] = {}; 
      loop(object[key], ++index); 
     //At last key, set value 
     } else { 
      object[key] = value; 
      return object; 
     } 
    } 
    return loop(object, 0); 
} 

哪个应该工作国际海事组织但不(无限循环,必须是一个愚蠢的错误,但不能看到它)。

而且我敢肯定,必须有一个更简单的方法

+0

请伪代码解释,这将是更好的:) –

+0

似乎第6行是一个问题。我没有看到“对象”被设置的位置:“if(key in object){”。另外,为什么不在对象生成器中使用JSON? –

+0

@ mohamed-abshir对象通过递归函数作为参数收到 您如何使用JSON来实现? – Rayjax

回答

1

尝试以下操作:

function objectBuild(object, keys, value) { 
    for (var i = 0; i < keys.length-1; i++) { 
     if (!object.hasOwnProperty(keys[i])) 
      object[keys[i]] = {}; 
     object = object[keys[i]]; 
    } 
    object[keys[keys.length-1]] = value; 
} 

用法示例(see it in action):

var object = {}; 
objectBuild(object, ["foo", "moreFoo"], "bar"); 
objectBuild(object, ["foo", "ultraFoo"], "bigBar"); 
// object --> {foo: {moreFoo: "bar", ultraFoo: "bigBar}} 
+0

工程就像一个魅力 – Rayjax