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

JavaScript使用switch push对象时数组历史数据被覆盖问题求助

问题原因分析

核心是JavaScript引用类型的赋值特性导致的:

  • 你在全局作用域仅创建了唯一的attachmentObj对象,JS中对象属于引用类型,数组执行push操作时,实际存入数组的是该对象的内存地址引用,而非对象的独立拷贝。
  • 每次调用addAttachmentToList函数时,你都直接修改同一个全局attachmentObj的imgUrl属性,由于所有数组中存储的引用都指向这同一个对象,所以最后一次修改的属性值会同步到所有引用的读取结果上,看起来就是之前存入的内容被覆盖了。
  • 当你改为直接pushimgUrl字符串时,字符串属于JS基本数据类型,push时会做值拷贝,每个数组元素都是独立的字符串值,不存在引用共享的问题,因此运行正常。
修复方案

只需要把attachmentObj的实例化逻辑挪到函数内部,保证每次调用都生成全新的独立对象即可:

var attachmentLinks = {
  pdf: [],
  docx: [],
  png: [],
  jpg: [],
  xlsx: [],
  pptx: [],
  other: [],
};
function addAttachmentToList(type, imgUrl) {
  // 每次调用创建新的独立对象
  let attachmentObj = {
    imgUrl: imgUrl,
    isDuplicate: false,
    duplicateCount: 0,
  };
  let fileType = type.toLowerCase();
  switch (fileType) {
    case 'pdf':
      attachmentLinks['pdf'].push(attachmentObj);
      break;
    case 'docx':
    case 'doc':
      attachmentLinks['docx'].push(attachmentObj);
      break;
    case 'png':
      attachmentLinks['png'].push(attachmentObj);
      break;
    case 'jpg':
    case 'jpeg':
    case 'jfif':
      attachmentLinks['jpg'].push(attachmentObj);
      break;
    case 'xlsx':
    case 'csv':
      attachmentLinks['xlsx'].push(attachmentObj);
      break;
    case 'pptx':
      attachmentLinks['pptx'].push(attachmentObj);
      break;
    default:
      attachmentLinks['other'].push(attachmentObj);
      break;
  }
}

额外优化:不需要通过this访问全局变量,直接调用全局定义的attachmentLinks即可,避免this指向异常的额外问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:45:05