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

如何复制带父子关系的对象数组并生成新ID?

解决方案

问题分析

你当前代码的问题包括:

  • 直接修改原数组example中的对象属性,若原对象是只读状态(比如被冻结),就会触发TypeError;
  • 变量名错误:childrenOfThisNode应为childrenOfThisChild;
  • 逻辑顺序混乱:遍历原数组时修改原数组内容,会干扰后续迭代,且没有统一维护新旧ID的映射关系,导致父子关联出错。

正确实现思路

要维持父子关系,核心是先建立旧ID到新ID的映射表,再基于映射表生成新数组:

  1. 遍历原数组,为每个对象生成新ID,存入映射表;
  2. 再次遍历原数组,复制每个对象,并用映射表替换id、parentId(非根节点)和childIds中的所有旧ID。

代码实现

// 假设第三方ID生成函数
function generateId() {
  // 示例生成逻辑,实际替换为第三方函数
  return Math.floor(Math.random() * 100).toString();
}

const example = [
  { id: "1", childIds: ["2"], parentId: "0" },
  { id: "2", childIds: ["3", "4"], parentId: "1" },
  { id: "3", childIds: [], parentId: "2" },
  { id: "4", childIds: ["5", "6"], parentId: "2" },
  { id: "5", childIds: [], parentId: "4" },
  { id: "6", childIds: [], parentId: "4" },
];

function copyWithNewIds(arr) {
  // 第一步:建立旧ID到新ID的映射
  const idMap = {};
  arr.forEach(item => {
    idMap[item.id] = generateId();
  });

  // 第二步:生成新数组,替换所有ID
  return arr.map(item => {
    return {
      id: idMap[item.id],
      // 替换parentId:根节点(parentId为"0")保持原ID
      parentId: item.parentId === "0" ? "0" : idMap[item.parentId],
      // 替换childIds数组中的每个旧ID
      childIds: item.childIds.map(childId => idMap[childId])
    };
  });
}

const copied = copyWithNewIds(example);
console.log(copied);

代码说明

  • idMap存储每个旧ID对应的新ID,确保所有关联ID的替换逻辑一致;
  • 使用map方法生成新数组,完全不修改原数组,避免了只读属性的报错;
  • 根节点(parentId: "0")保持原ID不变,符合示例预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:45:48