2016-09-14 8 views
1

私は再帰を介して現在アクセスしているが、実行できない子のすべての親ノードにアクセスするためのロジックを構築しようとしていますそう。ここで私はこれまで何をやったかです:Javascript再帰:子ノードの親アクセスのインスタンスへの方法

は、ここに私の配列です:

var results = [{ 
    "key": 1, 
    "name": "A", 
    "child": [{ 
    "key": 2, 
    "name": "A1", 
    "child": [{ 
     "key": 1473591350189, 
     "name": "A11" 
    }] 
    }, { 
    "key": 10, 
    "name": "A2", 
    "child": [] 
    }] 
}, { 
    "key": 66, 
    "name": "B", 
    "child": [{ 
    "key": 67, 
    "name": "B1", 
    "child": [{ 
     "key": 68, 
     "name": "B11", 
     "child": [{ 
     "key": 69, 
     "name": "B111", 
     "child": [] 
     }] 
    }] 
    }] 
}]; 

は今、私のロジックが反復のためです:

function recursionFn(results, parentNode) { 
    for (var i = 0; i < results.length; i++) { 
    var _node = results[i]; 
    if (_node.child.length > 0) { 
     console.log('Name: ' + _node.name + ' First Childs: ' + _node.child.length); 
     if (parentNode) 
     console.log('ParentNode: ' + parentNode.name); 
    } 
    if (_node.child.length > 0) 
     recursionFn(_node.child, _node); 
    if (_node.child.length == 0) { 
     console.log('Name: ' + _node.name + ' Second Childs: ' + _node.child.length); 
     if (parentNode) 
     console.log('ParentNode: ' + parentNode.name); 
    } 
    } 
} 

ここで私は、現在の子の直接の親を取得しています私は入っていますが、どうすればその子供の両親にアクセスできますか?たとえば、関係が: A - > A1 - > A11 の場合:A11のすべての親にどのようにアクセスできますか?前もって感謝します!!

答えて

1

親を歩くことは、再帰ではなくループで行う方がよい。 階層内のすべてのノードを歩くことは、(おそらく)ループ内での再帰よりもよく行われます。

は、私は、これはあなたがコールバックで定義されている指名手配ノードの親ノードをseachingための反復再帰的なアプローチを使用することができ、両親

function navParents(node) 
{ 
    if(!node) 
     return; 
    while(node != null) { 
     /* do something with node here */ 
     node = node.parent; 
    } 
} 
+1

彼のデータ構造は、親ノードへの逆ポインタを持っていません。親を見つけるには、子供を見つけるために再帰的な散歩をしなければなりません。彼が探しているアルゴリズムは、ゲームプログラミングやネットワーク最適化で、より頻繁に使用されています:Dijkstraのアルゴリズム(ヒューリスティックにガイドされたバージョン、A *は通常ゲームAIのための経路探索に使用されます) – slebetman

1

を歩くことをお勧めします。

この提案では、ノードが見つかった場合、このレベルで反復を停止できるため、Array#someが使用されます。

結果配列には、ルートから最終ノードまでのすべての親ノードが含まれます。

function getParentNodes(tree, callback) { 
 
    var nodes = []; 
 
    tree.some(function iter(a) { 
 
     if (callback(a) || Array.isArray(a.child) && a.child.some(iter)) { 
 
      nodes.unshift(a); 
 
      return true; 
 
     } 
 
    }); 
 
    return nodes; 
 
} 
 

 
var results = [{ key: 1, name: "A", child: [{ key: 2, name: "A1", child: [{ key: 1473591350189, name: "A11" }] }, { key: 10, name: "A2", child: [] }] }, { key: 66, name: "B", child: [{ key: 67, name: "B1", child: [{ key: 68, name: "B11", child: [{ key: 69, name: "B111", child: [] }] }] }] }]; 
 

 
console.log(getParentNodes(results, function (o) { return o.name === 'A11'; }));
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Schols、getParents(結果、 'A11')コール関数には、引数の中に親の名前文字列があります。私は親の名前に直接アクセスすることはできません。 –

+0

@コードカロ、こんにちは、私の名前は*ニーナです。あなたの機能に期待するものを加えてください。入力と予想される出力は何ですか? –

+0

入力は配列です。子ノードに何らかの条件に基づいて設定したフラグがあり、それをすべての親に設定する必要があります。だからこそ私はこの子供の両親に逆戻りしたい。 –

関連する問題