2015-10-06 85 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