我一直在這一整天,試圖在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