IWoTke 2024-02-21 09:01 采纳率: 93.5%
浏览 15
已结题

js树形结构递归获取数据



```javascript
const data = [  
  {  
    isOpen: '1',  
    id: 1,  
    children: [  
      {  
        isOpen: '1',  
        id: '1_1',  
        parentId: 1,  
        children: [  
          {  
            id: '1_1_1',  
            parentId: '1_1',  
            isOpen: '1',  
            children: [  
              {  
                id: '1_1_1_1',  
                parentId: '1_1_1',  
                isOpen: '0'  
              },  
              {  
                id: '1_1_1_2',  
                parentId: '1_1_1',  
                isOpen: '0'  
              }  
            ]  
          },  
          {  
            id: '1_1_2',  
            parentId: '1_1',  
            isOpen: '1',  
            children: [  
              {  
                id: '1_1_2_1',  
                parentId: '1_1_2',  
                isOpen: '0'  
              }  
            ]  
          },  
          {  
            id: '1_1_3',  
            parentId: '1_1',  
            isOpen: '0'  
          }  
        ]  
      }  
    ]  
  }  
];  
  找出id1_1_1_1的父元素、祖父元素、曾祖父元素的id,然后合并到一个数组,但是得满足一个条件id1_1_1_1节点本身的isOpen等于1,同层级其他的isOpen等于0,不然的话就返回空数组,不再返回祖父和曾祖父元素id,要是条件满足再继续向上递归返回祖父和曾祖父的元素id

```

  • 写回答

4条回答 默认 最新

  • CSDN专家-showbo 2024-02-21 09:55
    关注
    
         
        const data = [
            {
                isOpen: '1',
                id: '1',
                text:'设置',
                children: [
                    {
                        isOpen: '1',
                        id: '1_1',
                        parentId: 1,
                        children: [
                            {
                                id: '1_1_1',
                                parentId: '1_1',
                                isOpen: '1',
                            }
                        ]
                    },
                    {
                        isOpen: '1',
                        id: '1_2',
                        parentId: 1,
                        text: '模板',
                        children: [
                            {
                                id: '1_2_1',
                                parentId: '1_2',
                                isOpen: '1',
                                children: [
                                    {
                                        id: '1_2_1_1',
                                        parentId: '1_2_1',
                                        isOpen: '0',
                                    },
                                    {
                                        id: '1_2_1_2',
                                        parentId: '1_2_1',
                                        isOpen: '1',
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        ];
    
        /**
         * 递归查找父节点Id,并压入数组
         * @param node 父节点
         * @param targetId 目标节点
         * @param parentIds  父节点集合
         * @param siblings 兄弟节点
         */
        function findParent(node, targetId, parentIds, siblings) {
            if (node.id === targetId && node.isOpen == '1'
                && siblings.filter(i => i.id != targetId && i.isOpen == '1').length==0//判断兄弟元素是否isOpen全为0
            )
                return true;//目标节点且满足条件
    
            if (!node.children || !node.children.length) return false;//无子元素,结束查找
    
            //继续查找子元素
            for (let child of node.children) {
                if (findParent(child, targetId, parentIds, node.children)) {
                    parentIds.push({ siblings, id: node.id });
                    return true;
                }
            }
        }
        /**
         * 获取父节点Id集合
         * @param data  树形数据
         * @param targetId 要查找的节点Id
         */
        function getParentIds(data, targetId) {
            let parentIds = [];
    
            data.forEach(node => findParent(node, targetId, parentIds, data));
    
            //过滤父节点兄弟
            for (var i = parentIds.length - 1; i >= 0; i--) {
                if (parentIds[i].siblings.filter(i => i.isOpen == '1').length > 1) parentIds.splice(i+1)
            }
    
            return parentIds.map(i=>i.id);
        }
    
        console.log(getParentIds(data, '1_2_1_2'));
        console.log(getParentIds(data, '1_1_1'));
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 2月29日
  • 已采纳回答 2月21日
  • 修改了问题 2月21日
  • 创建了问题 2月21日

悬赏问题

  • ¥15 preLaunchTask"C/C++: aarch64- apple-darwin22-g++-14 生成活动 文件”已终止,退出代码为-1。
  • ¥18 关于#贝叶斯概率#的问题:这篇文章中利用em算法求出了对数似然值作为概率表参数,然后进行概率表计算,这个概率表是怎样计算的呀
  • ¥20 C#上传XML格式数据
  • ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下
  • ¥100 单片机hardfaulr
  • ¥20 手机截图相片分辨率降低一半
  • ¥50 求一段sql语句,遇到小难题了,可以50米解决
  • ¥15 速求,对多种商品的购买力优化问题(用遗传算法、枚举法、粒子群算法、模拟退火算法等方法求解)
  • ¥100 速求!商品购买力最优化问题(用遗传算法求解,给出python代码)
  • ¥15 虚拟机检测,可以是封装好的DLL,可付费