2015-04-07 47 views
0

假設我有一個能容納自身的其它實例的類:如何遞歸獲取嵌套對象中的所有子項的列表?

function Thing() { 
    this.subThings = []; 
} 

我添加nsubThings頂端的事情:

var rootThing = new Thing(); 

rootThing.subThings.push(new Thing()); 
rootThing.subThings.push(new Thing()); 
rootThing.subThings.push(new Thing()); 

然後我添加nsubThings的一些rootThing的的subThings

rootThing.subThings[0].subThings.push(new Thing()); 
rootThing.subThings[0].subThings.push(new Thing()); 
rootThing.subThings[0].subThings.push(new Thing()); 

在th是點,結構是這樣的:

rootThing 
| 
+--subThing 
| | 
| +--subThing 
| | 
| +--subThing 
| | 
| +--subThing 
| 
+--subThing 
| 
+--subThing 

所以,我怎麼可以得到所有的subThing S的rootThing列表和所有的他們subThing S'

function getAllChildren(beginNode) { 
    var allChildren = []; 

    beginNode.subThings.forEach(function(childNode) { 
     allChildren.push(childNode); 
     // allChildren = allChildren.concat(childNode.subThings); // something along these lines 
    }); 

    return allChildren; 
} 

console.log(getAllChildren(rootThing)); 
+1

'console.dir(rootThing)':) –

+0

'的console.log(JSON.stringify(rootThing,假的,'「)) ' – lxe

+2

想象一下,只有一個級別,並實現了一個打印'事物'+它的後代的函數。然後發佈。如果你這樣做,我們會告訴你如何將這個函數改變爲在幾個按鍵中遞歸。 – zerkms

回答

0

你在找這樣的嗎?

var GetAllThings = function(Thing thing) { 
    var result = []; 

    //Assume you want to remove the subthings as you flatten 
    var subthings = thing.subthings; 
    thing.subThings = null; 

    result.push(thing); 

    for(var i = 0; i < subthings i++) { 
     result.concat(GetAllThings(subthings[i])); 
    } 

    return result; 
}; 

這將基本上拉平樹,但如果你只是想看看/處理它,上面的意見是正確的,你可以只處理這個作爲一個JSON對象。

1

與感謝@zerkms,這裏是一個工作實現:

function getAllChildren(beginNode) { 
    var allChildren = beginNode.subThings; 

    beginNode.subThings.forEach(function(childNode) { 
     allChildren = allChildren.concat(getAllChildren(childNode)); 
    }); 

    return allChildren; 
} 
相關問題