博主信息
Sky
博文
291
粉丝
0
评论
0
访问量
7185
积分:0
P豆:617

【前端】一道算法题,有会的可以一起讨论下

2021年10月11日 19:32:16阅读数:22博客 / Sky

const data = {

   name: 'A',child: [{name: 'AB',child: [{name: 'AABA'},
{name: 'AABB'}
]
},
{name: 'AC',child: [{name: 'AACA'},
{name: 'AACB'}
]
}
]
}// 请自行封装一个findPath的函数,实现如下效果// 调用示例

findPath(‘AABB’); //[“A”, “AB”, “AABB”]

findPath(‘AABA’); //[“A”, “AB”, “AABA”]

findPath(‘AACB’); //[“A”, “AC”, “AACB”]

findPath(‘AC’); //[“A”, “AC”]

findPath(‘AACA’); //[“A”, “AC”, “AACA”]

回答

这种算法最适合用递归吧

const findPath = (name, data, result = []) => {  let _result;  for (const item of data) {    if (item.name === name) {      return [...result, item.name];
   } else if (item.child) {
     _result = findPath(name, item.child, [...result, item.name]);      if (_result) {        return _result;
     }
   }
 }
};

findPath('AACB', [data]);

@李十三 的观点很好,直接判断键名就能拿到结果了,只需一次计算,如果需要多次调用应该是最优解

const dataReduce = (data, parent = [], result = {}) => {
 data.forEach(item => {
   result[item.name] = [...parent, item.name];
   item.child && dataReduce(item.child, result[item.name], result);
 });  return result;
};const _data = dataReduce([data]);

_data['AACB'];//["A", "AC", "AACB"]
const data = {  'A': {name:'A',parent:undefined},  'AB':{name:'AB',parent:'A'},  'AABA':{name:'AABA',parent:'AB'},
 ...
}

我会先将数据转换成上面的结构缓存下来
这样后面QQ号码买号平台地图取的时候就简单多了

const data = {
       name: 'A',
       child: [{
           name: 'AB',
           child: [{
               name: 'AABA'
           },
               {
                   name: 'AABB'
               }
           ]
       },
           {
               name: 'AC',
               child: [{
                   name: 'AACA'
               },
                   {
                       name: 'AACB'
                   }
               ]
           }
       ]
   }
   function getAllKeys(data,result=[]){
       result.push(data.name);        if(data.child){            for(let c of data.child){
               getAllKeys(c,result);
           }
       }        return result;
   }    const result=getAllKeys(data);
   function findPath(path){        return result.filter(item=>path.indexOf(item)!=-1);
   }
   function wraplog(fun){
       return function addParams(...params){            const _r=fun(...params);
           console.log(_r);            return _r;
       }
   }    const _findPath=wraplog(findPath);
   _findPath('AABB'); //["A", "AB", "AABB"]

   _findPath('AABA'); //["A", "AB", "AABA"]

   _findPath('AACB'); //["A", "AC", "AACB"]

   _findPath('AC'); //["A", "AC"]

   _findPath('AACA'); //["A", "AC", "AACA"]
function findPath(obj, path) {    var ret = [];    var name = obj.name;    var child = obj.child;
   check: if (name === path) {
       ret.push(name);        break check;
   } else if (Array.isArray(child)) {        for (var i = 0; i < child.length; i++) {            var item = child[i];            var tmp = findPath(item, path);            if (tmp.length) {
               ret = Array.prototype.concat.apply(ret, [name, tmp]);                break check;
           }
       }
   }    return ret;
}console.log(findPath(data, "AABB"));


版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • PHP7教程栏目今天将介绍Linuxphp7安装命令哪些,小小总结,需要朋友看看,大家学习,进去,
    python编程用良好,本文介绍常见几种循环结构,并且几个具体编程示例,需要朋友看看,
    JavaScript栏目介绍些常见封装,需要朋友看看,或者意见,欢迎评区留言,学习进步。
    java基础教程栏目介绍Java8如何计日期时间差,方简练,需要朋友看看,总结学习,也
    这篇文章主要是想和大家学习,工作之中哪些让我们眼JavaScript代码简洁小技巧。需要朋友看看,学习
    本篇文章给大家分享些字节跳动最爱考,关于计机网络面试参考价值,需要朋友参考,希望对大家所帮助。
    初入时候觉得CSS知display、position、float就在布局上游刃余了,随着后工作问层出不穷,才逐渐了解到CSS并不是几个style属性那么简单,最近看了些关于行高知识
    最近呢,我发现很多新手小伙伴都在搜索“查看PHP版本”,恰好最近雨,借此机,我就将这个方实操过程分享给新手小伙伴们,我也是从新手之路上步走到现在职业化做项目,所新手多难自然也是感同身受
    当今数字世界,存在着无数网站,每天都需要处理各种不同原因访问。然而,这些网站中很大部分显得笨重,使用来也很麻烦。