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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】