如何递归移除文件结构中的空目录?
解决递归移除文件结构中空目录的问题
原代码的问题分析
你的代码存在两个关键问题:
- 错误过滤文件节点:过滤子节点时用
fileObjectChild.fileObjects.length > 0,但文件(FILE类型)没有fileObjects属性,这会把所有文件直接过滤掉,不符合需求。 - 未处理递归后变为空的目录:即使递归处理了子目录,当前目录可能因为所有子节点都是空目录被移除后,自身变成空目录,但原代码没有判断这种情况,会保留空目录(比如示例中的
st/ko/ve空目录,原代码会保留整个链)。
正确实现方案
我们需要先递归处理所有子节点,再判断当前目录是否还有有效子节点(文件或非空目录),如果没有则标记为需要移除:
function processFileObject(fileObject) { // 处理文件:直接返回原对象 if (fileObject.type === "FILE") { return fileObject; } // 处理目录:先递归处理所有子节点,过滤掉返回null的空目录 const processedChildren = fileObject.fileObjects .map(child => processFileObject(child)) .filter(child => child !== null); // 如果处理后子节点为空,说明当前目录是空目录,返回null表示移除 if (processedChildren.length === 0) { return null; } // 返回处理后的目录对象 return { ...fileObject, fileObjects: processedChildren }; } // 处理根节点,过滤掉空目录 const newFileObjects = { fileObjects: input.fileObjects .map(item => processFileObject(item)) .filter(item => item !== null) };
测试验证
用你提供的输入数据测试:
- 输入中的
st/ko/ve是空目录,递归处理后会被逐级移除,最终整个st目录因为没有有效子节点被移除。 - 文件
ac会被保留。 rf/lo/we是有效文件,整个目录链会被保留。
最终结果和你期望的输出完全一致。
内容的提问来源于stack exchange,提问作者feerlay
相关产品推荐
相关产品推荐

