如何复制带父子关系的对象数组并生成新ID?
解决方案
问题分析
你当前代码的问题包括:
- 直接修改原数组
example中的对象属性,若原对象是只读状态(比如被冻结),就会触发TypeError; - 变量名错误:
childrenOfThisNode应为childrenOfThisChild; - 逻辑顺序混乱:遍历原数组时修改原数组内容,会干扰后续迭代,且没有统一维护新旧ID的映射关系,导致父子关联出错。
正确实现思路
要维持父子关系,核心是先建立旧ID到新ID的映射表,再基于映射表生成新数组:
- 遍历原数组,为每个对象生成新ID,存入映射表;
- 再次遍历原数组,复制每个对象,并用映射表替换
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
相关产品推荐
相关产品推荐

