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

使用克隆方法循环推入对象到数组仍引用相同,求解决方案

问题分析与解决方案

我一眼就看出问题出在浅拷贝上!你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:17:48