求递归算法为嵌套数组元素添加parentId关联其父元素
递归添加parentId实现嵌套数组元素关联
原代码问题分析
你的代码仅能处理第一层嵌套元素的核心原因:
linkNestedElements函数中,return arr2写在了for...of循环内部,导致循环仅执行一次(处理数组第一个元素)就直接返回,剩余元素完全被忽略。- 拆分的
linkElements函数属于冗余设计,单个递归函数即可完成所有层级的处理。
修正后的递归实现
下面是一个简洁且能处理任意深度嵌套的递归函数:
const addParentIds = (items, parentId = null) => { for (const item of items) { // 为当前元素添加parentId item.parentId = parentId; // 递归处理子元素(可选链+长度判断,避免空数组/undefined报错) if (item.children?.length) { addParentIds(item.children, item.id); } } return items; };
代码说明
- 函数接受两个参数:待处理的元素数组
items,以及父元素IDparentId(顶层元素默认parentId为null)。 - 遍历数组时直接为每个元素添加
parentId属性,无需额外赋值操作。 - 若当前元素存在非空的
children数组,递归调用自身处理子元素,传入当前元素的id作为子元素的parentId。 - 直接修改原对象属性,若需要保留原数组不被修改,可以先对数组做深拷贝后再处理。
测试示例
// 测试用例 const testData = [ { id: '1', children: [ { id: '1-1', children: [ { id: '1-1-1' }, { id: '1-1-2' } ] }, { id: '1-2' } ] }, { id: '2' } ]; addParentIds(testData); // 验证结果 console.log(testData[0].children[0].parentId); // 输出 '1' console.log(testData[0].children[0].children[0].parentId); // 输出 '1-1' console.log(testData[1].parentId); // 输出 null
内容的提问来源于stack exchange,提问作者Mikhail
相关产品推荐
相关产品推荐

