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

如何为对象数组元素生成包含自身ID与父级ID的parents数组?

实现数组元素的层级ID收集(为parents字段赋值)

你的问题在于原代码只处理了直接父级,没法应对多级嵌套的场景(比如id=4的元素,需要追溯到父级的父级id=1)。下面是可行的实现方案:

核心思路

  1. 先把数组转换成以id为键的映射对象,这样可以快速查找任意节点的父节点,避免反复遍历数组浪费性能。
  2. 对每个节点,向上遍历所有父节点直到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 18:51:58