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

如何在JavaScript中避免数组对象赋值时的引用关联?

问题解决:修改数组B时数组A同步更新的原因及修复方案

原因分析

你用B = [...A]做的是浅拷贝——这种操作只会复制数组的外层结构,但数组里的每一个对象还是和原数组A里的对象共享同一个内存引用。所以当你修改B中某个对象的属性时,本质上是在修改内存里的同一个对象,数组A自然会跟着发生变化。

修复方案

以下几种方法可以实现数组的深拷贝,让B和A彻底独立:

  1. 对象展开语法实现浅层级深拷贝
    如果数组里的对象都是单层结构(没有嵌套对象),可以用map配合对象展开:
B = A.map(item => ({...item}));

这个方法会遍历A中的每个对象,复制其所有属性生成新对象,最终得到的B数组里的对象和A完全独立。

  1. JSON序列化反序列化(适合无特殊类型的对象)
    如果你的对象里没有函数、Symbol、循环引用这类特殊内容,用JSON转译是最简单的深拷贝方式:
B = JSON.parse(JSON.stringify(A));

把数组转成JSON字符串再解析回来,相当于创建了一份完全独立的副本。

  1. 递归深拷贝函数(处理嵌套对象)
    如果数组里的对象有多层嵌套,上面两种方法就不够用了,可以写一个递归的深拷贝函数:
function deepCopy(obj) {
  if (typeof obj !== 'object' || obj === null) return obj;
  // 处理数组
  if (obj instanceof Array) return obj.map(item => deepCopy(item));
  // 处理对象
  const newObj = {};
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObj[key] = deepCopy(obj[key]);
    }
  }
  return newObj;
}

// 初始化B
B = deepCopy(A);

额外说明

你初始化C的方式是没问题的,因为d3.json每次请求都会返回全新的对象数组,和A不存在引用关联。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:50:26