js深度優先和廣度優先遍歷語法樹


在遍歷html語法樹中用到了深度優先遍歷和廣度優先遍歷,就自己用js實現了下

//treeSearch.js
//廣度遍歷html節點
function breadthSearch(item, childProp='children'){
const nodeList=[item]
let index=0;
while (index<nodeList.length){
const node=nodeList[index++];
if(node[childProp]){
for(let k in node[childProp]){
nodeList.push(node[childProp][k]);
}
}
}
return nodeList;
}
//深度遍歷html節點
function depthSearch(node,childProp='children'){
const nodeList=[]
const depthEach=function(item){
nodeList.push(item);
if(item[childProp]){
for(let k in item[childProp]){
depthEach(item[childProp][k]);
}
}
}
depthEach(node);
return nodeList;
}
//廣度遍歷
function breadthEach(node,filter) {
const nodeList=[]
const itemList=[node]
let index=0;
while (index<itemList.length){
const item=itemList[index++];
if(filter(item)){
nodeList.push(item);
}
for(let k in item){
if(item[k]&&typeof item[k]==='object'){
itemList.push(item[k])
}
}
}
return nodeList;
}
//深度遍歷
function depthEach(node,filter){
const nodeList=[]
const depthEach=function(item){
if(filter(item)){
nodeList.push(item);
}
for(let k in item){
if(item[k]&&typeof item[k]==='object'){
depthEach(item[k]);
}
}
}
depthEach(node);
return nodeList;
}
module.exports={
breadthSearch,depthSearch,breadthEach,depthEach
}

  

測試

const fs=require('fs')
const {depthEach}=require('./utils/treeSearch')
const code=fs.readFileSync('./test.js').toString()
const ast=require("babylon").parse(code, {
// parse in strict mode and allow module declarations
sourceType: "module",

plugins: [
// enable jsx and flow syntax
"jsx",
"flow"
]
});
const arr=depthEach(ast,function (node) {
return node.type==='VariableDeclaration'
})
console.log(arr.length)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM