【问题标题】:How do I get the size of a varying-depth JSON object in javascript?如何在 javascript 中获取不同深度 JSON 对象的大小?
【发布时间】:2012-01-14 17:12:31
【问题描述】:

我整天都在做这个,试图用 Javascript 编写一个递归函数来获取大小。我需要一些帮助:/

基本上,我的 JSON 对象包含分层类别/子类别。我想确定每个类别/子类别的大小。

这里是一个简单的演示:http://pastehtml.com/view/bkpzzlabs.html

我想获取左侧的 JSON 并获取右侧的 HTML。也许我只是盯着这台电脑显示器太久了,因为我这辈子都想不通。

非常感谢您的帮助。

【问题讨论】:

标签: javascript recursion


【解决方案1】:

“演示”的右侧表明您不只是想递归地计算 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)。这与您的示例相关,例如“坑洼”是一个数组。

【讨论】:

  • 感谢您抽出宝贵的时间来写这篇文章!看起来 num_children 值实际上是应该的 double 值,但我现在正在查看是否可以修复它。
  • @Tobias:哎呀,对不起!那里有点脑残。看我的更新。 :-)
  • 太棒了!你知道如何让它对数组部分进行计数吗?例如,它没有给出 'Pothole' 的 num_children,因为它是一个 [] 数组,但它会计算 'Abandoned Building',因为它是一个 {} 对象。
  • 似乎我只需向数组添加一个键就可以使用它。再次感谢!
【解决方案2】:

这个问题很模糊。我想你需要的是类似于 deepcopy 的东西。以下是 deepcopy 的功能。

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 功能。

【讨论】:

    猜你喜欢
    • 2010-11-17
    • 1970-01-01
    • 2018-08-19
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多