[英]Traversing a uncalculable nested array backwards, node traversal - Javascript?
我有一个具有这样结构的对象
{
this.parent: undefined,
this.nodes: []
}
内部nodes
可以是具有相同结构的任意数量的对象,但是父节点将被设置为以nodes数组为其属性的对象的父对象。 当对象遵循此模式时,顶级对象可能具有嵌套节点,这些嵌套节点可能非常深。
我想向顶层对象添加一个方法,该方法将反向搜索所有节点。 下面是我要实现的示例,但此功能正在向前搜索。
{
this.parent: undefined,
this.nodes: [],
this.searchForward: function() {
this.nodes.forEach(function(node) {
this.searchForward.call(this, node);
}, this);
}
}
上面的searchForward
函数将搜索所有节点,直到它们能到达的深度searchForward
,然后移动到行中的下一个节点等,等等。
我正在尝试编写一个函数,该函数将从最深的孩子递归搜索到其父对象(本质上与上述相反)。
任何让我入门的想法都很棒,谢谢。
首先,如果您只想遍历路径回到根目录,那很简单。 (不过,我很确定那不是您想要的。)
this.searchUp: function() {
var parnt = this.parent;
while (parnt) {
// do something, if you want
parnt = parnt.parnt;
}
}
我考虑的第一件事是在“做某事”部分中调用searchForward
。 这可能行得通,但让我感到效率低下-每次上另一个父级时,您都将搜索已经搜索过的节点。 尽管如此,它本身应该起作用。 (只要您从searchUp调用searchForward,就没有无限循环的风险。)
我们可以使其更加复杂,并且只需添加一个标志就可以避免冗余。 您需要修改searchForward
并使其类似于以下功能:
this.initializeSearched: function() {
this.nodes.forEach(function(node) {
this.searched = false;
this.initializeSearched.call(this, node);
}, this);
}
this.searchForward: function() {
this.nodes.forEach(function(node) {
if (this.searched) { continue; }
this.searchForward.call(this, node);
}, this);
}
一旦你有了这个,你应该能够只是把searchForward
的“有所作为”一节中searchUp
和完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.