1

私はそのような構造を持つオブジェクトを持っています

{
    this.parent: undefined,
    this.nodes: []
}

内部nodesには、同じ構造を持つ任意の数のオブジェクトを含めることができますが、親はノード配列をプロパティとして持つオブジェクトの親に設定されます。オブジェクトがこのパターンに従うため、トップ レベルのオブジェクトはネストされたノードを持つ可能性があり、非常に深い可能性があります。

すべてのノードを逆方向に検索するメソッドを最上位オブジェクトに追加したいと考えています。私が達成しようとしていることの例を以下に示しますが、この関数は前方を検索しています。

{
     this.parent: undefined,
     this.nodes: [],

     this.searchForward: function() {

         this.nodes.forEach(function(node) {

             this.searchForward.call(this, node);
         }, this);
     }
}

上記のsearchForward関数は、すべてのノードを可能な限り深く検索してから、行内の次のノードなどに移動します。

最も深い子から親に戻って再帰的に検索する関数を作成しようとしています(基本的に上記を逆にします)。

私を始めるためのアイデアは素晴らしいでしょう、ありがとう。

4

1 に答える 1

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

于 2013-05-20T05:15:05.753 に答える