2015-04-07 103 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; 
}