递归实现为每个对象打上层级标识(levelCode
)
功能说明
该方法通过递归遍历树形结构数据,为每个对象添加 levelCode
字段,用以标识当前对象的层级。
核心代码
实现逻辑
/**
* 为树形数据的每个对象添加层级标识 `levelCode`
* @param {Array} data - 树形数据数组
* @param {number} level - 当前层级(默认从 0 开始)
* @returns {Array} - 添加了 `levelCode` 的数据
*/
function addLevelCode(data, level = 0) {
data.forEach((item) => {
// 添加层级标识
item.levelCode = level;
// 如果存在子节点,递归处理
if (item.children) {
addLevelCode(item.children, level + 1);
}
});
return data; // 返回处理后的数据
}
// 示例数据
let data = [
{
id: "32432345",
children: [
{
id: 111,
children: []
},
{
id: 22,
children: []
}
],
},
{
id: "312",
children: [
{
id: 114321,
children: []
},
{
id: 543,
children: []
}
],
},
];
// 调用函数并输出结果
let result = addLevelCode(data);
console.log(result);
实现效果
处理后的数据结构示例:
[
{
id: "32432345",
levelCode: 0,
children: [
{
id: 111,
levelCode: 1,
children: []
},
{
id: 22,
levelCode: 1,
children: []
}
]
},
{
id: "312",
levelCode: 0,
children: [
{
id: 114321,
levelCode: 1,
children: []
},
{
id: 543,
levelCode: 1,
children: []
}
]
}
];
代码拆解与分析
1. 添加层级标识
item.levelCode = level;
- 每个对象的层级标识
levelCode
,由函数的level
参数决定。 - 初始层级为
0
,每递归深入一层,level
加 1。
2. 递归处理子节点
if (item.children) {
addLevelCode(item.children, level + 1);
}
- 判断对象是否存在子节点(
children
字段)。 - 如果有子节点,则递归调用函数,为子节点继续添加
levelCode
。
3. 返回结果
return data;
- 函数返回处理后的数据,可以用于链式调用或直接使用。
关键点总结
-
递归结构清晰:
- 函数通过
forEach
遍历每个节点,同时递归处理子节点,直至叶子节点。
- 函数通过
-
动态层级计算:
- 利用递归参数
level
动态传递当前层级信息,每深入一层,层级自动递增。
- 利用递归参数
-
数据原地修改:
- 该方法直接在输入数据对象上添加
levelCode
字段,不会创建新的数据副本。
- 该方法直接在输入数据对象上添加
适用场景
-
树形结构数据展示:
- 前端页面中,需要根据层级标识(如缩进、样式等)展示嵌套数据。
-
层级分析:
- 为树形数据添加层级信息,便于数据统计或逻辑处理。
-
递归算法的入门示例:
- 展示递归算法在树形数据中的典型应用,代码结构清晰,逻辑易懂。
优化方向
-
提高代码鲁棒性:
- 可增加对输入数据的合法性检查,确保数据结构符合要求(如
data
是数组,children
是可选属性等)。
- 可增加对输入数据的合法性检查,确保数据结构符合要求(如
-
非原地修改版本:
- 如果需要保持原始数据不变,可采用深拷贝的方法,生成新的数据对象进行修改。
总结
本方法简洁高效,通过递归为树形结构数据添加层级标识,既满足了树形数据的层级展示需求,又为递归算法的学习提供了经典案例。