3步轻松解密游戏音频:acbDecrypter完整指南
2026/5/26 15:56:21
本案例通过递归算法实现树形结构的遍历,主要涉及以下知识点:
举个例子
基础数据
const mockData = [{id: 1, labe: '父节点1', children: [{id:11,label:'子节点1',},{id:12,label:'子节点2',},{id:13,label:'子节点3',},],},{id: 2, labe: '父节点2', children: [{id:21,label:'子节点1',},{id:22,label:'子节点2',},{id:23,label:'子节点3',},],},{id: 3, labe: '父节点3', children: [{id: 31, label: '子节点1', children: [{id:311,label:'子节点1.1',},{id:312,label:'子节点1.2',},{id:313,label:'子节点1.3',},],},{id:32,label:'子节点2',},{id:33,label:'子节点3',},],},];const selectKey = [1,11,12,22];需求:根据给定选中的节点id值,自动填充其父级在节点id
constcollectAllParents=(nodes,checkedKeys)=>{constresult=newSet();nodes.forEach(item=>{// 基础判断:当前节点是否被选中if(checkedKeys.has(item.id))result.add(item.id);// 递归处理子节点if(item?.children?.length>0){constsubResult=collectAllParents(item.children,checkedKeys);// 合并子结果与当前节点if(subResult.size>0){result.add(item.id);// 父节点自动选中subResult.forEach(id=>result.add(id));}}});returnresult;};item.children.length === 0)时,递归自然终止constcheckedKeys=newSet(selectKey);O(1)时间复杂度的成员判断(has()方法)subResult.forEach(id=>result.add(id));当子节点被选中时:
if(subResult.size>0){result.add(item.id);// 自动选中父节点// 合并子节点结果}forEach合并到父级结果// 从根节点到最深层子节点的递归穿透constsubResult=collectAllParents(item.children,checkedKeys);if(checkedKeys.has(item.id))result.add(item.id);if(subResult.size>0){...}递归遍历每层涉及的变量值是相互独立的,在每一层收集之后进行合并整合