问题
获取如下结构的path,并过滤包含子节点的path
[
{
path: '/test',
component: 'x',
},
{
path: '/',
component: 'x',
routes: [
{
path: '/aaa',
component: 'x',
},
{
path: '/bbbb',
component: 'x',
},
]
}
]
实现
递归
const routers = [];
const childrenKey = 'routes';
const pathKey = 'path';
function getCom (targetArr){
const arr = [];
targetArr.forEach(item=>{
if(Array.isArray(item[childrenKey])) {
arr.push(...getCom(item[childrenKey]));
}else {
arr.push(item[pathKey])
}
})
return arr
}
const coms = getCom(routers)
尾递归(转换要点:在最后一句时所有依赖的遍历转为递归函数参数)
const routers = [];
const childrenKey = 'routes';
const pathKey = 'path';
function getCom (result, others = [] ){
if(others.length===0){
return result;
}
result.push(...others.filter(i=>!i[childrenKey]).map(i=>i[pathKey]));
var nextOthers = [];
others.filter(i=>i[childrenKey]).forEach(i=>nextOthers.push(...i[childrenKey]));
return getCom(result, nextOthers);
}
const coms = getCom([], routers)
迭代
const routers = [];
const childrenKey = 'routes';
const pathKey = 'path';
function getCom (others){
const result = [];
const stack = [...others.reverse()];
while(stack.length>0){
const item = stack.pop();
if(!item[childrenKey]){
result.push(item[pathKey]);
continue;
}
stack.push(...item[childrenKey])
}
return result;
}
const coms = getCom(routers)