構文木のJSの深さ優先と幅優先トラバーサル

HTMLの構文木トラバーサルの深さ優先探索と幅優先トラバーサルを使用し、jsの隣に自分で達成

//广度遍历HTML节点
機能breadthSearch(項目、childProp){ 
    CONSTのNodeList = [アイテム] 
    インデックス= 0ましょう。
    一方、(指数<nodeList.length){ 
        CONSTノード= nodelistと[インデックス++]。
        IF(ノード[childProp]){ 
            {(ノード[childProp]におけるkを聞かせて)ため
                nodeList.push(ノード[childProp] [K])。
            } 
        } 
    } 
    nodelistとを返します。
} 
//深度遍历HTML节点
機能depthSearch(ノード、childProp){ 
    CONST nodelistと= [] 
    CONST depthEach =関数(アイテム){ 
        nodeList.push(アイテム)
        IF(項目[childProp]){ 
            {(項目におけるK [childProp]せて)のために
                depthEach(項目[childProp] [K])。
            }
        } 
    } 
    depthEach(ノード)。
    nodelistとを返します。
}

  

テスト

// HTML的语法树
CONST astJSON = { 
    "タイプ":1、
    "タグ": "本文"、
    "attrsList":[]、
    "attrsMap":{}、
    "rawAttrsMap":{}、
    "子供":[ 
        { 
            "タイプ":1、
            "タグ": "DIV"、
            "attrsList":[]、
            "attrsMap":{}、
            "rawAttrsMap":{}、
            "親": "[円〜】" 
            "子" :[ 
                { 
                    "タイプ":1、
                    "タグ": "スパン"、
                    "attrsList":[]、
                    "attrsMap":{}、
                    "rawAttrsMap":{}、
                    "親": "[円形〜.children.0]"、
                    "子供":[ 
                        { 
                            "タイプ":3、
                            "テキスト": "\ nののfoo \ nを"、
                            "スタート":37、
                            "終わり":48、
                            "静的":真
                        } 
                    ]、
                    "開始" 31、
                    "終了":55、
                    "普通":真、
                    "静的":真
                }、
                { 
                    "タイプ":3 
                    "テキスト":"」、 
                    "スタート":55、
                    "終わり":58、
                    "静的":真
                }、
                { 
                    "タイプ":1、
                    "タグ": "スパン"、
                            "静的":真
                        } 
                    ]、
                    "attrsList":[]、
                    "attrsMap":{}、
                    "rawAttrsMap":{}、
                    "親": "[円形〜.children.0]"、
                    "子供":[ 
                        { 
                            "タイプ":3、
                            「テキスト「: "バー"、
                            "スタート":64、
                            "終わり":67、
                    "スタート":58、
                    "終わり":74、
                    "プレーン":真、
                    ""静的:真
                } 
            ]、
            "スタート":23、
            "終了":81、
            "普通":真、
            "静的":真
        }、
        { 
            "タイプ":3、
            "テキスト": ""、
            "開始":81、
            "終了" 83、
            "静的":真
        }、
        { 
            "タイプ" :1、
            "タグ": "DIV"、
            "attrsList":[]、
            "attrsMap":{}、
            "rawAttrsMap":{}、
            "親": "[円〜】" 
            "子":[ 
                { 
                    "タイプ":1、
                    "タグ": "スパン"、
                    "attrsList":[]、
                    "attrsMap":{}、
                    "rawAttrsMap":{}、 
                    "親": "[円形〜.children.2]"、
                    "子供":[ 
                        { 
                            "タイプ":3、
                            "テキスト": "\ n個のfoo \ nを"、
                            "開始":127、 
                            "終了":136、
                            ""静的:真 
                        } 
                    ]、
                    "開始" 121、
                    「終了":143、
                    "普通":真、
                    "静的":真
                }、
                { 
                    "タイプ":3、
                    "テキスト":"」、
                    "開始":143、
                    "終了" 144、
                    "静的":真
                }
                { 
                    "タイプ":1、 
                    "タグ": "スパン"、
                    "attrsList ":[]、 
                    "attrsMap":{}、
                    "rawAttrsMap":{}、
                    "親": "[円形〜.children.2]"、
                    "子供":[ 
                        { 
                            "タイプ":3、
                            "テキスト": "バー"、
                            "開始」150、
                            "終了" 153、
                            "静的":真
                        } 
                    ]、
                    "開始" 144、
                    "終了":160、
                    「プレーン」:真、
                    真:「静的」
                } 
            ]、
            "開始":115、 
            "終了" 167、
            "普通":真、
            "静的":真
        }、
        { 
            "タイプ":3、
            "テキスト": ""、
            "開始":167、
            "終了":169、
            ""スタティック:真
        }、
        { 
            "タイプ":1、
            "タグ": "DIV"、
            "attrsList":[]、
            "attrsMap":{}、
            "rawAttrsMap":{}、
            "親": "[丸〜" 、
            "子供":[ 
                { 
                    "タイプ":1、
                    "タグ": "スパン"、
                    "attrsList":[]、
                    "attrsMap":{}、
                    "rawAttrsMap":{}、
                    "親": "[円形〜.children.4]"、
                    "子供":[ 
                        { 
                            "タイプ":3、
                            「テキスト":" FOO」、
                            "開始":212、
                            "終了" 217、
                            "静的":真
                        } 
                    ]、
                    "開始" 206、
                    "終了":224、
                    「プレーン」:真、
                    「静的」:真
                }、
                { 
                    "タイプ":3、
                    "テキスト": ""、
                    "開始":224、
                    "終了" 225、
                    "静的":真
                }、
                { 
                    "タイプ":1、
                    "タグ": "スパン"、
                    "attrsList":[]、
                    "attrsMap":{}、
                    "rawAttrsMap":{}、
                    "親": "[円形〜.children.4]"、
                    "子供":[ 
                        { 
                            "タイプ":3、
                            "テキスト": "バー"、
                            "開始":231、
                            "終了" 234、
                            "静的":真
                        } 
                    ]、
                    "開始" 225、
                    "終了" 241、
                    "普通":真、
                    "静的":真
                } 
            ]、
            "開始" 201、
            "終了" 247、
            "普通"、真の
            "静的":真
        } 
    ]、
    "スタート":0、
    "終わり":255、
    "プレーン":trueの場合、
    "静的":真、
    "staticInFor":偽、
    "staticRoot":真、
    "staticProcessed":真
} 

//广度优先遍历
。breadthSearch(astJSON、 '子供')のforEach(関数(ノード){ 
    (node.type場合=== 1)
        にconsole.log(node.tag)
})

//深度优先遍历
depthSearch(astJSON、 '子供')。forEachの(関数(ノード){ 
    (node.type === 1)場合に
        はconsole.log( node.tag)
})

 

幅優先  

身体
のdiv
div要素
のdiv
スパン
スパン
スパン
スパン
スパン
スパン

深さ優先

のdiv
スパン
スパン
divの
スパン
スパン
のdiv
スパン
スパン

おすすめ

転載: www.cnblogs.com/caoke/p/10990148.html