我一直在这一整天,试图在Javascript中编写递归函数来获取大小。我需要一些帮助:/如何在JavaScript中获取变化深度的JSON对象的大小?
基本上,我的JSON对象包含层次结构类别/子类别。我想确定每个类别/子类别的大小。
下面是一个简单的例子:http://pastehtml.com/view/bkpzzlabs.html
我想借此左边的JSON,并获得正确的HTML。也许我只是一直盯着这台电脑显示器太久,因为在我的生活中,我无法弄清楚这一点。
非常感谢您的帮助。
我一直在这一整天,试图在Javascript中编写递归函数来获取大小。我需要一些帮助:/如何在JavaScript中获取变化深度的JSON对象的大小?
基本上,我的JSON对象包含层次结构类别/子类别。我想确定每个类别/子类别的大小。
下面是一个简单的例子:http://pastehtml.com/view/bkpzzlabs.html
我想借此左边的JSON,并获得正确的HTML。也许我只是一直盯着这台电脑显示器太久,因为在我的生活中,我无法弄清楚这一点。
非常感谢您的帮助。
您的“演示”的右侧表明您不只是递归计算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_它应该是什么,但我现在正在审查,看看我是否可以解决这个问题。 – 2012-01-14 19:19:17
@Tobias:哎呀,对不起!那里有一点点大脑失灵。查看我的更新。 :-) – PPvG 2012-01-14 20:11:33
太棒了!你知道如何让它做数组部分的计数吗?例如,它不会为'Pothole'提供num_children,因为它是一个[]数组,但它会计算'Abandoned Building',因为它是一个{}对象。 – 2012-01-14 20:15:14
问题是模糊的。我想你需要的是类似于深度拷贝的东西。以下是深度复制的功能。
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功能。
你有没有写过任何代码?请显示你有什么。 – Hogan 2012-01-14 17:15:28
@Hogan http://codepad.org/Wjlr1rJW – 2012-01-14 18:19:23