You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现递归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
  };
}

逻辑说明

  1. 递归遍历:对每个节点调用自身,实现深度遍历整个树形结构
  2. 目标判断:匹配目标ID(或ID+类型)时,返回undefined,后续通过filter(Boolean)过滤掉这些节点
  3. 不可变处理:通过扩展运算符...创建新节点对象,避免直接修改原数据结构,保证数据纯净性

使用示例

// 删除ID为"3"的节点
const updatedExplorer = deleteNode(explorer, "3");

// 删除ID为"2"的文件夹节点
const updatedExplorer2 = deleteNode(explorer, "2", true);

内容的提问来源于stack exchange,提问作者HalfWebDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 20:39:19