2012-03-22 64 views
0

我有一個對象遍歷的遞歸結構和數據添加到倒數第二個節點

x = { 
      "y": 55.11, 
      "color": "#4572A7", 
      "level": 0, 
      "drilldown": { 
       "name": "MSIE versions", 
       "level": 1, 
       "color": "#4572A7", 
       "categories": ["MSIE 8.0", "MSIE 6.0", "MSIE 7.0", "MSIE 9.0"], 
       "data": [ 
        { 
         "y": 33.06, 
         "color": "#4572A7", 
         "level": 1, 
         "drilldown": { 
          "name": "drilldown next level", 
          "level": 2, 
          "color": "#4572A7", 
          "categories": ["a", "b", "c"], 
          "data": [23,54,47] 
         } 
        }, 
       ] 
      } 
     } 

注意這實際上可以去任何深度爲我添加新的屬性的對象,但就像

上特有的格式
x['drilldown] = {} 
x.drilldown['data] =[] 
....and so on.... 

因此,假設在同一時間我有對象的結構如下:

x { 
drilldown { 
     data [ 
      drilldown { 
       data [1,2,3] 
       } 
      ] 
     } 
} 
..................... 

我需要去對象'x'的第二個最後'數據'元素並推送新值。所以,在我的例子基於上述這將是這樣的:

x.drilldown.data.push(10); 

所以在我需要找到對象「X」的倒數第二個數據屬性,然後在它

X推值。 倒數第二個數據陣列 .push(10);

我該怎麼做?

============================================== ====================================

[加入溶液]

我加下面的代碼,它工作正常。我希望這是對做正確的方式:

var data = [10,11,12]; 
var datatemp = x.drilldown; 
var datatempvar = {}; 
for (;typeof datatemp != 'undefined';) 
{ 
    datatempvar = datatemp; 
    datatemp = datatemp.drilldown; 
} 
for(it=0;it<data.length; it++) 
    datatempvar.data.push(data[it]); 

謝謝大家 - 這個論壇對我幫助很大。

+3

它對jQuery有什麼特別的瞭解? – gdoron 2012-03-22 21:47:13

+0

如何遍歷對象 - 有什麼辦法嗎? – Prakash 2012-03-22 21:55:01

+1

jQuery遍歷DOM或甚至XML,而不是對象...也許你可以找到一個插件,但我懷疑它。 – gdoron 2012-03-22 21:56:39

回答

0

如果數據數組包含多個值,特別是某些對象具有向下鑽取和一些普通值,會發生什麼情況?

在每種情況下,您都必須設置一個循環,測試是否還有深入兩個級別,並針對每個級別執行此操作。當它中斷時,當前級別是您想要添加元素的級別。

0

從這個問題,我不知道你是否想要「倒數第二」的項目,或最後一個。

但是,這是一個例子,它隔離了第二個倒數第二個項目。 然後它會在最後一個項目上推送一個值。

<html> 
<head> 
<script type="text/javascript"> 

     x = { 
      "drilldown": { 
       "data": 
        { 
         "drilldown": { 
          "data": [23,54,47] 
         } 
        } 

      } 
     } 




    function pushValue(dataItem, value) { 
     var parent = null; 
     var child = dataItem; 
     while(child.drilldown != null) { 
      parent = child; 
      child = child.drilldown.data; 
     } 
     // Child is now the last item in the structure 
     // and parent is the second last item 
     child.push(value); 
    } 

    function performTest() { 
     pushValue(x, 36); 
     } 
</script> 
</head> 
<body> 
    <button onclick="performTest()">Run</button> 
</body> 
</html>