js遍历树结构,查找某个节点的父级元素

const treeData = [
          {
               title: '0-0',
               key: '0-0',
               children: [
                   {
                       title: '0-0-0',
                       key: '0-0-0',
                       children: [
                           { title: '0-0-0-0', key: '0-0-0-0' },
                           { title: '0-0-0-1', key: '0-0-0-1' },
                           { title: '0-0-0-2', key: '0-0-0-2', children: [{title: '0-0-0-0-0', key: '0-0-0-0-0'}] },
                       ],
                   },
                   {
                       title: '0-0-1',
                       key: '0-0-1',
                       children: [
                           { title: '0-0-1-0', key: '0-0-1-0' },
                           { title: '0-0-1-1', key: '0-0-1-1' },
                           { title: '0-0-1-2', key: '0-0-1-2' }
                       ],
                   },
                   {
                       title: '0-0-2',
                       key: '0-0-2',
                   }
               ],
           },
           {
               title: '0-1',
               key: '0-1',
               children: [
                   { title: '0-1-0-0', key: '0-1-0-0' },
                   { title: '0-1-0-1', key: '0-1-0-1' },
                   { title: '0-1-0-2', key: '0-1-0-2' },
               ]
           },
           {
               title: '0-2',
               key: '0-2',
           }
       ];

       // 1. 为子节点添加父级的key
       function addParentKeyWrapper (tree) {
           const data = JSON.parse(JSON.stringify(tree)); // 深度克隆(deepClone)
           function addParentKey(data, parentKey) {
               data.forEach(ele => {
                   const { children, key } = ele;
                   ele.parent = parentKey;
                   if (children){
                       addParentKey(children, key);
                   }
               })
           }
           addParentKey(data, null); // 一开始的时候是null
           return data;
       }
 
       
       // 2.给了树中间的某个节点,如何去寻找该节点所有的父级节点呢?
       // 答案是:把树拉平。(每个节点之间的联系依靠parentKey属性)
       function flattenTreeDataClosure(data){
           const treeData = JSON.parse(JSON.stringify(data));
           const flattenData = [];
           function flattenTree(data, parentKey) {
               data.forEach(ele => {
                   const { title, key, children } = ele;
                   flattenData.push({ title, key, parentKey });
                   if (children){
                       flattenTree(children, key);
                   }
               })
           }
           flattenTree(treeData, null);
           return flattenData;
       }
       const result = flattenTreeDataClosure(treeData);
       console.log(result);

       // 3.给个节点0-0-1-0,找到ta所有的父级节点
       function findParent(item, flattenTree){
           const parentArr = []; // 存储所有的父级元素
           function find(item, flattenTree) {
               flattenTree.forEach(ele => {
                   if (ele.key === item){
                       parentArr.unshift(ele.key);
                       find(ele.parentKey, flattenTree);
                   }
               })
           }
           find(item, flattenTree);
           return parentArr;
       }

       console.log(findParent('0-0-0-0-0', result)); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值