2013-05-10 55 views
4

假設我有可以有子對象的對象層次結構。所有對象都有獨特的id。我只需要從id中的任何位置檢索一個對象。例如,層次結構可能看起來像這樣:從深層次結構中檢索具有給定屬性的對象

 
var hierarchy = [ 
    {id: 1, children: [ 
    {id: 7}, 
    {id: 8} 
    ]}, 
    {id: 2}, 
    {id: 3, children: [ 
    {id: 9}, 
    {id: 10, children: [ 
     {id: 11}, 
     {id: 12}, 
     {id: 13} 
    ]} 
    ]}, 
    {id: 4}, 
    {id: 5}, 
    {id: 6, children: [ 
    {id: 14} 
    ]} 
]; 

和函數調用看起來是這樣的:

 
retrieveObjectById(10, hierarchy); 
// => {id: 10, children: [...]} 

我試着寫使用Array.filter一個函數,會得到遞歸調用上元素的子元素遇到時,但它也會返回祖先。

+0

你應該包括你搞什麼名堂試過至今。 – Josh 2013-05-10 17:07:52

回答

3

解決這些問題的思路一般是使用這樣的遞歸函數:

function deepFind(obj, id) { 
    if (obj.id==id) return obj; 
    if (obj.children) { 
     for (var i=0; i<obj.children.length; i++) { 
      var o = deepFind(obj.children[i], id); 
      if (o) return o; 
     } 
    } 
} 

隨着你的根級別對象有不一樣的結構,你既可以在循環或hierarchy使它類似:

var myObject = deepFind({children:hierarchy}, 10); 

Demonstration

+0

謝謝,今天不能腦了。我知道這是相當微不足道的。 – harbichidian 2013-05-10 17:20:10