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

TypeScript如何递归更新嵌套对象并为叶子节点添加额外属性

TypeScript递归更新嵌套对象属性实现方案

需求说明

需要使用TypeScript递归处理动态层级的嵌套对象,为嵌套结构中的叶子节点添加指定额外属性,同时按照父级层级拼接叶子节点的headerName字段。

输入数据示例

[
  {
    "headerName": "Group 1",
    "children": [
      {
        "field": "G1-C1"
      },
      {
        "field": "G1-C2"
      }
    ]
  },
  {
    "headerName": "Group 2",
    "children": [
      {
        "headerName": "G2 - C1",
        "children": [
          {
            "field": "G2 - C1-C1"
          },
          {
            "field": "G2 - C1-C2"
          }
        ]
      },
      {
        "field": "G2-C2"
      },
      {
        "field": "G2-C3"
      }
    ]
  },
  {
    "headerName": "Group3",
    "children": [
      {
        "field": "G3-C1"
      },
      {
        "field": "G3-C2"
      }
    ]
  }
]

目标输出格式

[
  {
    "headerName": "Group 1",
    "children": [
      {
        "field": "G1-C1",
        "visible": true,
        "width": 200,
        "headerName": "Group1"
      },
      {
        "field": "G1-C2",
        "visible": true,
        "width": 200,
        "headerName": "Group1"
      }
    ]
  },
  {
    "headerName": "Group 2",
    "children": [
      {
        "headerName": "G2 - C1",
        "children": [
          {
            "field": "G2 - C1-C1",
            "width": 200,
            "headerName": "Group2-C1"
          },
          {
            "field": "G2 - C1-C2",
            "width": 200,
            "headerName": "Group2-C1"
          }
        ]
      },
      {
        "field": "G2-C2",
        "width": 200,
        "headerName": "Group2"
      },
      {
        "field": "G2-C3",
        "width": 200,
        "headerName": "Group2"
      }
    ]
  },
  {
    "headerName": "Group3",
    "children": [
      {
        "field": "G3-C1",
        "width": 200,
        "headerName": "Group3"
      },
      {
        "field": "G3-C2",
        "width": 200,
        "headerName": "Group3"
      }
    ]
  }
]

原有代码问题

你提供的现有实现存在以下问题:

  • 没有传递父级headerName的拼接规则,叶子节点的headerName直接赋值为field值,和要求的父级层级拼接结果不符
  • 没有添加示例要求的visible、width属性,反而增加了示例中不存在的sortable、hide字段
  • 直接修改原数组元素,存在污染原数据的副作用

正确实现代码

首先定义类型约束:

type Column = {
  headerName?: string;
  field?: string;
  children?: Column[];
  visible?: boolean;
  width?: number;
}

递归处理函数:

function formatColumns(columns: Column[], parentHeader = ''): Column[] {
  return columns.map(col => {
    // 分组节点:存在children,递归处理子节点,拼接当前层级header作为子节点前缀
    if (col.children && col.children.length > 0) {
      const currentHeader = col.headerName?.replace(/\s/g, '') || '';
      const childPrefix = parentHeader ? `${parentHeader}-${currentHeader}` : currentHeader;
      return {
        ...col,
        children: formatColumns(col.children, childPrefix)
      }
    }
    // 叶子节点:添加指定属性
    return {
      ...col,
      visible: true,
      width: 200,
      headerName: parentHeader
    }
  })
}

使用方式:

const processedColumns = formatColumns(原始列数据数组);

该实现返回新的数组对象,不会修改原输入数据,支持任意层级的嵌套结构。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:15:03