仮想設計DOMを作るために設計された最近のプロジェクトには、彼らは自然に仮想DOM /見つけるのノードを通過する必要性を避けることができないため、一般的な検索ノード二つの方法に過ぎないで - 幅優先探索と深さ優先探索私たちはデータ構造ツリートラバーサルで学んだ、これは実際には同じです。OK、それを見つけるためにこれらの2つの方法の私の理解について話をし、ADO。
まず、幅優先探索次工程ように、特徴であるBFSは、最初のキューによって発見されたストレージノードにFIFO待ち行列に適用されます。
1 / * * 2 * 3 * * @param {対象}:内部で検索するノード、宛先ノード、 4 * @param {}プロパ:検索インデックス 5つの *指数変性条件isLegal()内の 6 * / 。7 関数breadthSearch(ターゲット){ 8。 CONST nodelistと= [ターゲット]; 9 LETインデックス= 0 ; 10 ながら(指数< nodeList.length){ 11。 CONST nodelistとノード= [インデックス++ ]; 12は、 IF(node.children && node.children .LENGTH> 0 ){ 13がある ため(LET K でnode.children){ 14 nodeList.push(node.children [K])。 15 } 16 } 17 } 18 リターン 機能{(プロプ) 19 せtargetNodeList = []; 20 のために{(nodelistとのノードを聞かせて) 21 であれば(isLegal(ノード、プロプ)){ 22 targetNodeList.push(ノード)。 23 } 24 } 25 リターンtargetNodeList。 26 } 27 }
名前は、これが「最後に探る、」検索アルゴリズムであることを示唆しているよう深さ優先探索、DFS、続いて、それは最も深い一つのノードを検索して、順番にバックトラックの方法により、最も深い別のノードを発見されていたであろうサイクル。
1 / * * 2 * 3 * * @param {対象}:内部で検索するノード、宛先ノード、 4 * @param {}プロパ:検索インデックス 5つの *指数変性条件isLegal()内の 6 * / 。7 関数depthSearch(ターゲット){ 8。 CONST nodelistと= []; 9 CONST depthEach = 関数(項目){ 10 nodeList.push(項目) 。11 IF (item.children){ 12である ため(LET K でitem.children){ 13は depthEach(item.children [K]); 14 } 15 } 16 } 17 depthEach(ターゲット) 18 リターン 機能(プロパ){ 19 せtargetNodeList = []; 20 のために{(nodelistとのノードを聞かせて) 21 であれば(isLegal(ノード、プロプ)){ 22 targetNodeList.push(ノード)。 23 } 24 } 25 リターンtargetNodeList。 26 } 27 }