实现递归JSON节点删除:完善deleteNode函数的需求
递归删除树形结构中指定ID的节点
要实现删除树形结构中所有ID匹配的节点,核心思路是通过递归遍历每个节点,判断是否为目标节点,同时处理子节点数组并过滤已删除的项。以下是具体实现:
基础实现(仅按ID删除)
function deleteNode(explorerData, itemId) { // 当前节点为目标节点,返回undefined供后续过滤 if (explorerData.id === itemId) { return undefined; } // 递归处理子节点,过滤已删除的项 const processedItems = explorerData.items .map(item => deleteNode(item, itemId)) .filter(Boolean); // 返回新节点对象,避免修改原数据 return { ...explorerData, items: processedItems }; }
进阶实现(按ID+节点类型删除)
如果需要同时匹配ID和节点类型(文件夹/文件),可以加入isFolder参数判断,同时兼容数据中isFolder的字符串/布尔值类型:
function deleteNode(explorerData, itemId, isFolder) { // 统一处理isFolder的类型,兼容字符串和布尔值 const nodeIsFolder = typeof explorerData.isFolder === 'string' ? explorerData.isFolder.toLowerCase() === 'true' : explorerData.isFolder; // 匹配ID和节点类型时,标记为待删除 if (explorerData.id === itemId && nodeIsFolder === isFolder) { return undefined; } // 递归处理子节点数组 const processedItems = explorerData.items .map(item => deleteNode(item, itemId, isFolder)) .filter(Boolean); return { ...explorerData, items: processedItems }; }
逻辑说明
- 递归遍历:对每个节点调用自身,实现深度遍历整个树形结构
- 目标判断:匹配目标ID(或ID+类型)时,返回
undefined,后续通过filter(Boolean)过滤掉这些节点 - 不可变处理:通过扩展运算符
...创建新节点对象,避免直接修改原数据结构,保证数据纯净性
使用示例
// 删除ID为"3"的节点 const updatedExplorer = deleteNode(explorer, "3"); // 删除ID为"2"的文件夹节点 const updatedExplorer2 = deleteNode(explorer, "2", true);
内容的提问来源于stack exchange,提问作者HalfWebDev
相关产品推荐
相关产品推荐

