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
スパン
スパン