2011-09-11 108 views
3

我有一個嵌套的數組是這樣的:搜索嵌套的JavaScript對象,讓列祖列宗

array = [ 
    { 
     "id": "67", 
     "sub": [ 
      { 
       "id": "663", 
      }, 
      { 
       "id": "435", 
      } 
     ] 
    }, 
    { 
     "id": "546", 
     "sub": [ 
      { 
       "id": "23", 
       "sub": [ 
       { 
        "id": "4", 
       } 
      ] 
      }, 
      { 
       "id": "71" 
      } 
     ] 
    } 
] 

我需要通過id找到1個嵌套的對象,並得到其所有的父母,產生一組ID 。

find.array("71") 
=> ["546", "71"] 

find.array("4") 
=> ["546", "23", "4"] 

什麼是最乾淨的方法呢?謝謝。

+0

可以相同的ID出現在你的結構不止一次? – Paulpro

+0

使用遞歸遍歷樹並在每次迭代中構建父列表。 – 2011-09-11 21:25:16

+0

這種類型的數據結構的目標是什麼?感覺就像你將不得不循環一切來獲得你想要的東西。 – rwilliams

回答

7

遞歸:

function find(array, id) { 
    if (typeof array != 'undefined') { 
    for (var i = 0; i < array.length; i++) { 
     if (array[i].id == id) return [id]; 
     var a = find(array[i].sub, id); 
     if (a != null) { 
     a.unshift(array[i].id); 
     return a; 
     } 
    } 
    } 
    return null; 
} 

用法:

var result = find(array, 4); 

演示:http://jsfiddle.net/Guffa/VBJqf/

1

也許這個 - jsonselect.org。因爲JSON沒有像xml這樣的內部'父'屬性,所以我不認爲它適合你的需要。我只是玩過JSONSelect,並不認爲它適合你的需要。

可以找到與匹配的id的對象,但你不能向上導航。例如。

JSONSelect.match(':has(:root > .id:val("4"))', array)

返回我:

[Object { id="4"}]

這是很好的,它只是我不能從那裏去任何地方!

+1

謝謝,我真的不認爲這是要走的路,它是一個相當大的圖書館,對於簡單的事情 – Harry

+0

是的,我明白,我同意!我只是認爲我會編輯我的答案,並說明爲什麼我不認爲這是適當的情況下,民間人士想看到我的理由:) –