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)

转载于:https://www.cnblogs.com/caoke/p/10990148.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值