如何精简JS数组操作代码并修复硬编码嵌套深度限制Bug
问题根因
原代码存在两个核心设计缺陷,导致无法支持任意深度嵌套:
- 索引查找逻辑残缺:原
FaendKey函数依赖未定义的FaendKeyOld方法,遍历逻辑仅适配固定长度路径,没有实现通用的逐层向下查找能力 - 插入逻辑硬编码层级:通过
idKey.length == 1到idKey.length ==10的多层分支手动写属性访问路径,最多仅支持10层嵌套,超出层级直接失效 - 额外隐患:所有循环变量未声明直接使用,会泄露到全局作用域,容易引发跨逻辑的变量冲突
优化后代码
核心思路是抽离通用的逐层查找逻辑,从根目录开始顺着路径段一层一层往下定位最终的父目录,定位完成后直接执行插入,不需要针对不同层级写重复分支:
// 已存在的全局根文件系统数组,保持原有初始化逻辑即可let fileSystem = []; /** * 按路径段定位最终的父目录节点 * @param {string[]} pathSegs 拆分后的路径片段数组 * @returns {object|null} 定位到的父目录,路径不存在时返回null */ function getTargetParent(pathSegs) { let currentLevelItems = fileSystem; let targetDir = null; for (let i = 0; i < pathSegs.length; i++) { const currentSeg = pathSegs[i]; // 在当前层级查找名称匹配的节点 const matchedNode = currentLevelItems.find(node => node.name === currentSeg); if (!matchedNode) { console.warn(`路径片段${currentSeg}不存在,对应路径:${pathSegs.join('/')}`); return null; } // 遍历到最后一个路径段时,当前匹配节点就是新内容的父目录 if (i === pathSegs.length - 1) { targetDir = matchedNode; break; } // 未到最后一层,进入子目录继续查找 currentLevelItems = matchedNode.items; } return targetDir; } function onSuccess(data) { const results = data.d.results; for (let i = 0; i < results.length; i++) { const currentItem = results[i]; // 拆分路径并移除前4段无意义前缀 const pathSegs = currentItem.ServerRelativeUrl.split('/'); pathSegs.splice(0, 4); if (pathSegs.length === 0) continue; // 定位父目录 const parentDir = getTargetParent(pathSegs); if (!parentDir) continue; // 直接插入新目录节点,无需判断层级 parentDir.items.push({ name: currentItem.Name, isDirectory: true, __KEY__: currentItem.UniqueId, dateModified: currentItem.TimeLastModified, items: [] }); } }
优化说明
- 支持任意嵌套深度:通过循环逐层下钻的逻辑,没有硬编码层级上限,不管路径有多少层都能正常处理
- 代码可维护性更高:删除了原代码中10层重复的push分支,新增目录节点的逻辑只需要写一次,后续调整字段不需要多层同步修改
- 异常兼容:新增路径不存在的判断,不会因为某级目录缺失直接抛出JS错误阻断整个列表的渲染
- 无变量污染:所有循环变量、临时变量都用
let/const做块级声明,不会泄露到全局作用域 - 逻辑可复用:抽离的
getTargetParent方法可以在其他需要定位目录节点的场景直接复用,不需要重复写遍历逻辑
内容的提问来源于stack exchange,提问作者Flaxin
相关产品推荐
相关产品推荐

