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

Angular:从JSON中提取父节点与指定子节点的优化方案

需求与优化实现

原数据结构

我有如下JSON对象elements120:

elements120: {
    "data": {
        "name": "120",
        "type": "120"
    },
    "children": [
        {
            "data": {
                "name": "120A",
                "type": "120A"
            },
            "children": []
        },
        {
            "data": {
                "name": "120B",
                "type": "120B"
            },
            "children": []
        },
        {
            "data": {
                "name": "120C",
                "type": "120C"
            },
            "children": []
        }
    ]
}

期望输出

需要生成三个新的JSON对象,保留原父节点的data,仅包含对应名称的子节点:

Json 1: filtered120A

filtered120A: {
    "data": {
        "name": "120",
        "type": "120"
    },
    "children": [
        {
            "data": {
                "name": "120A",
                "type": "120A"
            },
            "children": []
        }
    ]
}

Json 2: filtered120B

filtered120B: {
    "data": {
        "name": "120",
        "type": "120"
    },
    "children": [
        {
            "data": {
                "name": "120B",
                "type": "120B"
            },
            "children": []
        }
    ]
}

Json 3: filtered120C

filtered120C: {
    "data": {
        "name": "120",
        "type": "120"
    },
    "children": [
        {
            "data": {
                "name": "120C",
                "type": "120C"
            },
            "children": []
        }
    ]
}

原始实现代码

我通过以下代码实现了需求,但代码冗余不优雅:

this.filtered120A = utils.deepClone(this.elements120);
this.filtered120B = utils.deepClone(this.elements120);
this.filtered120C = utils.deepClone(this.elements120);

this.filtered120A = this.filtered120A.filter((element) => {
      delete element.children[1];
      delete element.children[2];
      return true;
    });

this.filtered120B = this.filtered120B.filter((element) => {
          element.children[0] = element.children[1];
          delete element.children[1];
          delete element.children[2];
          return true;
        });

this.filtered120C = this.filtered120C.filter((element) => {
          element.children[0] = element.children[2];
          delete element.children[1];
          delete element.children[2];
          return true;
        });

优化实现方案

可以封装一个通用函数,根据子节点的name来生成过滤后的对象,避免重复代码:

// 定义通用过滤函数
const createFilteredNode = (originalNode, targetChildName) => {
  // 深克隆原节点,避免修改原数据
  const clonedNode = utils.deepClone(originalNode);
  // 过滤出指定名称的子节点
  clonedNode.children = clonedNode.children.filter(child => 
    child.data.name === targetChildName
  );
  return clonedNode;
};

// 生成三个过滤后的对象
this.filtered120A = createFilteredNode(this.elements120, '120A');
this.filtered120B = createFilteredNode(this.elements120, '120B');
this.filtered120C = createFilteredNode(this.elements120, '120C');

优化点说明

  • 复用性强:通用函数可处理任意目标子节点名称,后续新增子节点只需调用函数即可,无需重复编写过滤逻辑
  • 逻辑清晰:直接通过filter方法筛选目标子节点,比手动删除/替换数组元素更直观,减少出错概率
  • 代码简洁:避免了重复的深克隆和冗余过滤代码,整体代码量大幅减少

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:25:14