2015-10-06 87 views
0

假设我有以下对象:递归在对象 - 的Javascript

function recurse_object(my_obj) { 
    if ("top" in my_obj) { 
     var x = my_obj; 
     my_obj = { top: x }; 
    } else { 
    // missing test case. 
    } 
    return my_obj; 
} 

var my_obj = { 
    x: 0, 
    y: [Object] 
} 
我每次调用该函数 recurse_object我会添加另一个元素 my_obj,并创建一个递归对象时

这样在第一次通话后my_obj看起来像:

var my_obj = { 
    top: { 
     x: 0, 
     y: [Object] 
    } 
} 

recurse_object第二个电话会my_obj看起来像:

var my_obj = { 
     top: { 
     top: { 
      x: 0, 
      y1: [Object1] 
     }, 
     x: 1, 
     y2: [Object2] 
     } 
    } 

xymy_obj值会发生变化。可能会添加新的房产y2。因此,我将采用当前的my_obj并将其放入top,并将新元素复制到"new"my_obj。 我怎样才能在JS中完成?

+1

_“将添加另一个元素FOO,并创建一个递归的对象:” _'foo'不会出现在'js'定义的对象或变量在问题? – guest271314

+1

从你的目标的描述看来,'else'情况应该与'if'情况相同,换句话说,你不需要条件来检查'top'是否在'my_obj'中 –

+0

I认为你只是想'函数f(o){return {top:o}; }'和'my_obj = f(my_obj)' – Oriol

回答

1

你的功能似乎有点奇怪。如果我corectly明白你的问题,答案也许是这样的

function recurse_object(obj) { 

    var key='top'; 
    if (obj.hasOwnProperty(key)) { 
     //here we change the y 
     var keys = Object.keys(obj.top); 
     var count=''; 
     var currentCount=''; 
     //go through all keys to find y because we don't know exact name 
     for(var k in keys){ 
      if(k.indexOf('y')==0){ 
       currentCount=k.substring(1); 
       if(currentCount!='') 
       count=parseInt(currentCount)+1; 
       else 
       count=1; 
      } 
     } 
     var x=obj; 
     obj['y'+count]=obj.['y'+currentCount]; 
     delete obj.['y'+currentCount]; 
     obj.top=x; 
    } 
    else{ 
     obj.top=obj; 
    } 
} 
+0

它很接近。然而我的意思是'y0'和'y1',它们是'obj'完全不同的属性。假设'obj'以这两种新属性进行了扩展。 – cybertextron

+1

所以你继续递归与新的属性?也y0不在你的问题 – cjds

+0

@philippe认为upvoting /接受答案,如果它帮助你 – cjds