我有一个具有类似结构的对象
{
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
函数将搜索所有节点尽可能深,然后移动到行等下一个节点等等。
我正在尝试编写一个函数,它将从最深的孩子递归搜索回父母(基本上反过来)。
让我入门的任何想法都会很棒,谢谢。
答案 0 :(得分:1)
首先,如果你想要的只是遍历到根路径,那很简单。 (我很确定这不是你想要的。)
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
的“执行某事”部分即可完成。