2012-01-14 46 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功能。

相关问题