为了账号安全,请及时绑定邮箱和手机立即绑定

大佬们遇到过这个问题吗?平行结构数据,依次查找父数据求解答!

大佬们遇到过这个问题吗?平行结构数据,依次查找父数据求解答!

肥皂起泡泡 2019-06-19 09:20:01
letarr=[{code:'abcd',pcode:'abc',},{code:'abc',pcode:'ab'},{code:'ab',pcode:'a'}]letobj={code:'abcd',pcode:'abc',}如上所示,arr里面的数据都是有上下关系的,现在希望根据obj在arr中依次查找父级,比如obj的父应该是{code:'abc',pcode:'ab'},然后继续查找{code:'abc',pcode:'ab'}的父数据应为{code:'ab',pcode:'a'},以此类推,最后将符合条件的数据存放到一个数组里面,求一个递归的解法。
查看完整描述

2 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

从时间复杂度上来说,不建议笔者使用递归,递归隐藏问题,如内存泄漏,建议采用如下方案:
functiongetParent(obj,arr){
letcopyArr=[...arr];
letitems=[obj];
letindex=getIndex(arr,obj);
while(index!==-1){
items=copyArr.splice(index,1);
if(items.length){
index=getIndex(copyArr,items[0]);
}
}
returnitems;
}
functiongetIndex(arr,obj){
returnarr.findIndex((el)=>obj.pcode===el.code);
}
应用
letarr=[
{
code:'abcd',
pcode:'abc',
},
{
code:'abc',
pcode:'ab'
},
{
code:'ab',
pcode:'a'
},
{
code:"a",
pcode:"123"
}
]
letobj={
code:'abcd',
pcode:'abc'
}
getParent(obj,arr);
如果使用递归,建议使用楼下的递归方案。
                            
查看完整回答
反对 回复 2019-06-19
?
绝地无双

TA贡献1946条经验 获得超4个赞

循环获取到当前obj的父级元素,然后将父级元素作为当前元素递归下去,直到找不到父级元素为止:
functiongetAllParents(obj,arr){
letparent=arr.filter(item=>item.code===obj.pcode);
if(parent.length){
parent=parent.concat(getAllParents(parent[0],arr));
}
returnparent;
}
调用:
letarr=[
{
code:'abcd',
pcode:'abc',
},
{
code:'abc',
pcode:'ab'
},
{
code:'ab',
pcode:'a'
}
]
letobj={
code:'abcd',
pcode:'abc',
}
console.log(getAllParents(obj,arr));
                            
查看完整回答
反对 回复 2019-06-19
  • 2 回答
  • 0 关注
  • 270 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信