解决一个需求,前端做一个search功能
数据结构的话是树形数据,emmm,不只是单独的遍历,还需要找到搜索到节点的层次,并且进行拼接,拼接父级的name
大致的数据结构:
const arr=[ { name:'1',children:[{name:'2',children:null},{name:'3',children:[{name:'6',children:null}]}] }, {name:'4',children:[]}, {name:'5',children:[]} ]
其实就是一个树的遍历 , 不过有个问题需要去解决,就是拼接他的层级,
有两种解决方式,最先想到的自然是df,
我的解决思路是 额外的去维护一个栈,栈中缓存层级信息,不过递归的dfs在时间与空间上都不太行,放弃了这种做法
这里使用迭代的bfs,也就是广度优先遍历
export function preorderTraversal <T extends {[key: string]: any}>(
tree: Array<T>,
target: string,
name: keyof T = 'title' as string,//对比的字段
childrenName: keyof T = 'components' as string//子节点
): Array<T>{
//bfs 在队列节点中记录下层级信息
const stack: (T | string)[][] =[[...tree,'']]
//返回的数据
const res: Array<T> = []
//队列为空则遍历完毕
while (stack.length > 0)
{
const node = stack.shift() as T[]
for(let i=0; i<node?.length-1; i++)
{
if(node[i]?.[name]?.includes?.(target))
res.push({...node?.[i],level:node[node?.length-1]})
if(!isNil(node[i]?.[childrenName]) && node[i]?.[childrenName].length > 0)
{
const parentLevel= node[node.length-1]
const level =parentLevel ? `${parentLevel}/${node[i]?.[name]}` : node[i]?.[name]
stack.push([...node[i]?.[childrenName],level])
}
}
}
return res
}
- THE END -
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:http://www.cx330.cloud/index.php/2023/10/12/%e6%a0%91%e7%9a%84%e5%b1%82%e6%ac%a1%e9%81%8d%e5%8e%86/
11
😨 😨