2012-01-14 50 views
3

我一直在這一整天,試圖在Javascript中編寫遞歸函數來獲取大小。我需要一些幫助:/如何在JavaScript中獲取變化深度的JSON對象的大小?

基本上,我的JSON對象包含層次結構類別/子類別。我想確定每個類別/子類別的大小。

下面是一個簡單的例子:http://pastehtml.com/view/bkpzzlabs.html

我想借此左邊的JSON,並獲得正確的HTML。也許我只是一直盯着這臺電腦顯示器太久,因爲在我的生活中,我無法弄清楚這一點。

非常感謝您的幫助。

+0

你有沒有寫過任何代碼?請顯示你有什麼。 – Hogan 2012-01-14 17:15:28

+0

@Hogan http://codepad.org/Wjlr1rJW – 2012-01-14 18:19:23

回答

3

您的「演示」的右側表明您不只是遞歸計算JSON中端點(或「葉子」)的總數;你想知道樹中每個類別(非葉節點)的遞歸大小。這裏的關鍵是葉子和根之間的節點不計數。

更新:我更新了功能;參見下文。

試試這個:

function parseTree(parent) { 
    var hasNonLeafNodes = false; 
    var childCount = 0; 

    for (var child in parent) { 
     if (typeof parent[child] === 'object') { 
      // Parse this sub-category: 
      childCount += parseTree(parent[child]); 
      // Set the hasNonLeafNodes flag (used below): 
      hasNonLeafNodes = true; 
     } 
    } 

    if (hasNonLeafNodes) { 
     // Add 'num_children' element and return the recursive result: 
     parent.num_children = childCount; 
     return childCount; 
    } else { 
     // This is a leaf item, so return 1: 
     return 1; 
    } 
} 

此功能將修改原來的對象,從而使新的密鑰'num_children'被添加到樹中的每個非葉節點。函數返回所有parent的後代中葉節點的總數。請注意,也可以在對象的子集上調用此函數。

這裏有一個現場演示:http://jsfiddle.net/PPvG/CXXaB/

對此深感抱歉!我必須做一些其他的事情,顯然,忘了我在這裏做的是什麼...... ;-)

更新的解決方案應該正確計算地址,但請記住,數組不能有命名密鑰(例如num_children)。這在你的例子中與例如「坑窪」是一個數組。

+0

感謝您抽出寶貴時間!它看起來像num_children值實際上是_double_它應該是什麼,但我現在正在審查,看看我是否可以解決這個問題。 – 2012-01-14 19:19:17

+0

@Tobias:哎呀,對不起!那裏有一點點大腦失靈。查看我的更新。 :-) – PPvG 2012-01-14 20:11:33

+0

太棒了!你知道如何讓它做數組部分的計數嗎?例如,它不會爲'Pothole'提供num_children,因爲它是一個[]數組,但它會計算'Abandoned Building',因爲它是一個{}對象。 – 2012-01-14 20:15:14

0

問題是模糊的。我想你需要的是類似於深度拷貝的東西。以下是深度複製的功能。

function deepCopy(p) { 
    var c = {}; 
    for (var i in p) { 
      if (typeof p[i] === 'object') { 
      c[i] = (p[i].constructor === Array)?[]:{}; 
      deepCopy(p[i],c[i]); 
      } 
    else { 
      c[i] = p[i]; 
      } 
    } 
    return c; 
    } 

爲您的應用程序自定義上述deepcopy功能。

相關問題