使用克隆方法循环推入对象到数组仍引用相同,求解决方案
问题分析与解决方案
我一眼就看出问题出在浅拷贝上!你的cloneOptions函数只是做了浅层次的复制,而options里的body是一个嵌套对象——浅拷贝只会复制body的引用,不会复制它的实际内容。这就导致所有克隆出来的newOptions,它们的body属性都指向同一个对象。
你循环里每次修改options.body.start_time,其实都是在修改这个共享的body对象。虽然循环内打印时能看到当前的start_time是对的,但后面的循环会覆盖这个值,最后数组里所有对象的body自然都是最后一次修改的结果。
下面给你两种靠谱的解决办法:
方法一:改成递归深拷贝
把你的cloneOptions升级成深拷贝函数,这样嵌套对象也会被完整复制,不会共享引用:
const cloneOptions = (options) => { // 处理非对象和null的情况 if (typeof options !== 'object' || options === null) { return options; } // 区分数组和对象 const clone = Array.isArray(options) ? [] : {}; for (let key in options) { if (options.hasOwnProperty(key)) { // 递归拷贝每个属性 clone[key] = cloneOptions(options[key]); } } return clone; };
修改后,你原来的循环代码就可以正常工作了——每次克隆出来的newOptions都是完全独立的对象,包括嵌套的body。
方法二:用扩展运算符直接创建独立对象
如果你的环境支持ES6+,可以用扩展运算符(...)更简洁地创建新对象,避免共享引用:
let promiseArr = []; for (let i = 0; i < ISOarr.length; i++) { // 直接创建新的options对象,同时替换body里的start_time let newOptions = { ...options, body: { ...options.body, start_time: ISOarr[i] } }; promiseArr.push(newOptions); } console.log(promiseArr);
这种方式不需要单独写克隆函数,直接在循环里生成完全独立的newOptions,每个对象的body都是新创建的,彻底解决引用共享的问题。
你可以根据自己的代码环境选一种试试,两种方法都能解决你的问题~
内容的提问来源于stack exchange,提问作者Casey Shore
相关产品推荐
相关产品推荐

