如何为对象数组元素生成包含自身ID与父级ID的parents数组?
实现数组元素的层级ID收集(为parents字段赋值)
你的问题在于原代码只处理了直接父级,没法应对多级嵌套的场景(比如id=4的元素,需要追溯到父级的父级id=1)。下面是可行的实现方案:
核心思路
- 先把数组转换成以
id为键的映射对象,这样可以快速查找任意节点的父节点,避免反复遍历数组浪费性能。 - 对每个节点,向上遍历所有父节点直到
parentId为0,收集所有层级的ID(包括自身),组成parents数组。
代码实现
方式一:迭代遍历(推荐,避免递归深度问题)
const flattenArray = [ {"id": "1","name": "Car","parentId": "0","parents": []}, {"id": "2","name": "Car > Steering wheel","parentId": "1","parents": []}, {"id": "3","name": "Car > Wheel","parentId": "1","parents": []}, {"id": "4","name": "Car > Wheel > Wheel rim","parentId": "3","parents": []}, {"id": "5","name": "Bus","parentId": "0","parents": []}, {"id": "6","name": "Bus > Wheel","parentId": "5","parents": []} ]; // 创建节点映射表 const nodeMap = new Map(); flattenArray.forEach(node => nodeMap.set(node.id, node)); // 为每个节点生成parents数组 flattenArray.forEach(node => { const parents = []; let currentNode = node; // 向上遍历直到顶层节点(parentId为0) while (currentNode.parentId !== "0") { parents.unshift(currentNode.id); // 从父到子的顺序,所以插入数组头部 currentNode = nodeMap.get(currentNode.parentId); } // 加入顶层节点的ID parents.unshift(currentNode.id); node.parents = parents; }); console.log(JSON.stringify(flattenArray, null, 2));
方式二:递归实现(代码更简洁)
const flattenArray = [ {"id": "1","name": "Car","parentId": "0","parents": []}, {"id": "2","name": "Car > Steering wheel","parentId": "1","parents": []}, {"id": "3","name": "Car > Wheel","parentId": "1","parents": []}, {"id": "4","name": "Car > Wheel > Wheel rim","parentId": "3","parents": []}, {"id": "5","name": "Bus","parentId": "0","parents": []}, {"id": "6","name": "Bus > Wheel","parentId": "5","parents": []} ]; const nodeMap = new Map(); flattenArray.forEach(node => nodeMap.set(node.id, node)); // 递归获取当前节点的所有父级ID链 function getParentIds(node) { if (node.parentId === "0") { return [node.id]; } const parentNode = nodeMap.get(node.parentId); return [...getParentIds(parentNode), node.id]; } flattenArray.forEach(node => { node.parents = getParentIds(node); }); console.log(JSON.stringify(flattenArray, null, 2));
代码说明
- 映射表
nodeMap的作用是将节点ID和节点对象关联,让查找父节点的操作从O(n)降到O(1),大幅提升效率。 - 迭代方式通过
while循环向上遍历父节点,用unshift保证ID顺序是从顶层父节点到当前节点。 - 递归方式则通过函数调用自身,先获取父节点的ID链,再追加当前节点ID,逻辑更直观。
内容的提问来源于stack exchange,提问作者aries
相关产品推荐
相关产品推荐

