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

JavaScript拷贝异常:steps[main_algorithm]中loop1数组重复问题排查

问题原因分析

核心问题是浅拷贝导致的引用共享:

  • 使用Object.assign({}, main_algorithm_structure)拷贝结构时,对于loop1这类数组(引用类型),拷贝的只是原数组的引用,而非创建新的独立数组。
  • 每次循环中,所有structCopy的loop1属性都指向同一个原数组,后续往structCopy.loop1中push元素时,实际是往同一个共享数组里添加内容。最终steps["main_algorithm"]里的所有对象自然会拥有完全相同的loop1数组。

注:代码中用Object.create(loop1_struct)创建loop1元素对象的方式是正常的——这会生成原型指向loop1_struct的新对象,每个元素都是独立的,不会引发共享问题。

解决方案

解决关键是对main_algorithm_structure做深拷贝,确保每个structCopy的loop1是独立的新数组。以下是两种可行方案:

方案1:手动定向拷贝(适合结构简单场景)

直接创建新对象并手动初始化loop1为新数组,彻底切断引用:

// 替换原有的Object.assign拷贝代码
if(crSteps) {
  structCopy = {
    ...main_algorithm_structure, // 拷贝基础值类型属性
    loop1: [] // 创建全新空数组,避免引用共享
  };
}

这种方式性能更高,也能明确控制拷贝内容。

方案2:通用深拷贝函数(适合复杂结构扩展)

如果后续结构新增其他引用类型属性,可以用通用深拷贝函数递归处理:

// 定义深拷贝函数
function deepClone(obj) {
  if (typeof obj !== 'object' || obj === null) return obj;
  if (Array.isArray(obj)) return obj.map(item => deepClone(item));
  return Object.fromEntries(
    Object.entries(obj).map(([key, value]) => [key, deepClone(value)])
  );
}

// 使用深拷贝替换原浅拷贝
if(crSteps) {
  structCopy = deepClone(main_algorithm_structure);
}

该函数会递归拷贝所有嵌套的引用类型,确保每个对象/数组都是独立实例。

额外检查

确认循环末尾存在将structCopy推入steps.main_algorithm的代码(当前提供的代码片段中缺失这一步):

// 在x循环的最后添加
if(crSteps) {
  steps.main_algorithm.push(structCopy);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:01:34