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
相关产品推荐
相关产品推荐

