2013-05-16 74 views
0

這是我的JSON文件:json文件中的無限嵌套元素 - 如何獲取特定元素?

{ 
    "categories": { 

    "category": [ 
     { 
     "id": "1", 
     "title": "Android", 
    "subcategory": [ 

     { 
      "id": "1", 
      "title": "JavaScript", 
      "question": [ 

我的問題是:如果子類元素可以出現無限次數 嵌套本身我怎樣才能顯示在我的JSON文件中的每個子類中的所有元素在javascript的幫助下,我如何在嵌套中獲得北斗? 如果我寫我的代碼:

data.categories.category[i].subcategory[0].subcategory[0].subcategory[0].title   

這意味着,我需要補充的時候subcategory[0]無限多去各個 title屬性 - 創造了很多不同的函數來處理每一個不同的情況 - 這是我的問題。

+4

你說的無限是什麼意思?未指定的次數? –

+5

使用[遞歸](http://en.wikipedia.org/wiki/Recursion_(computer_science)#Recursive_procedures) – Quentin

+0

@ Quentin的評論後續操作:use [recursion](http://stackoverflow.com/questions/16588418/infinite -json-file-how-to-get-specific-element#comment23840284_16588418) – Doorknob

回答

2

只是重複他們:

function getAllTitles(node) { 
    var cats = data.categories.category, 
     titles = []; 
    for (var i=0; i<cats.length; i++) { 
     var cat = cats[i]; 
     while (cat.subcategory && cat.subcategory[0]) 
      cat = cat.subcategory[0]; // travel deeper 
     // now cat is a subcategory that has no subcategories any more 
     titles.push(cat.title); 
    } 
    return titles; 
} 
2

使用遞歸函數。例如:

function getLeafCategory(node) { 
    if (node.subcategory && node.subcategory[0]) { 
     return getLeafCategory(node.subcategory[0]); 
    } 
    return node; 
} 

很明顯,如果您的JSON真的無限大,那麼這將不起作用!但在這種情況下,您將無法首先加載它!

你會調用它是這樣的:

var myTitle = getLeafCategory(data.categories.category[i]).title; 

什麼功能需要做的是它會檢查你的過去,看看它是否有一個子類別,如果該子類別有一個零的條目。如果是這樣,它會再次將該新節點傳遞給該函數。如果不是,那麼你已經達到了鏈條的末端,並返回結果。

有關遞歸的一些注意事項:如果您的鏈條很長,最終可能會得到一個Stack Overflow。應該可以將遞歸函數重寫爲while循環,但代碼是(恕我直言)不那麼優雅。

function getLeafCategoryWithoutRecursion(node) { 
    while(node.subcategory && node.subcategory[0]) { 
     node = node.subcategory[0] 
    } 
    return node; 
} 

還要注意這兩個功能是假設你沒有(其中一個子類別實際指向回父母),這將導致這兩個功能在一個無限循環掛任何環路(雖然遞歸的最終會拋出Stack Overflow)。

+0

在這種情況下迭代看起來更簡單,順便說一句:-) – Bergi

+0

@Bergi:說實話,在試圖用'雖然'循環,我想我同意。 –

+1

當OP想要遍歷每個'子類別'數組時,遞歸可能會走的路:-) – Bergi