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

Node.js中推入数组的对象被后续更新影响的技术问题

问题:修改原对象导致数组中已有元素同步变化的原因及解决办法

你遇到的核心问题是JavaScript的引用类型特性:对象属于引用类型,当你把candleObject推入数组时,数组里存储的不是对象的副本,而是指向该对象内存地址的引用。这意味着不管是通过原变量candleObject,还是数组里的bitcoinCandleHistoryArray[0]操作,本质都是在修改同一个内存里的对象,所以会出现改一个全变的情况。

下面是几种解决办法:

1. 每次创建全新的蜡烛对象

不再复用同一个变量,每次需要新蜡烛时直接定义新对象,确保每个对象都是独立的:

var bitcoinCandleHistoryArray = [];

// 第一根蜡烛
var candle1 = {
  open: 100,
  high: 100,
  low: 100,
  close: 100,
  volume: 10000
};
bitcoinCandleHistoryArray.push(candle1);

// 第二根蜡烛
var candle2 = {
  open: 0,
  high: 0,
  low: 0,
  close: 0,
  volume: 0
};
bitcoinCandleHistoryArray.push(candle2);

2. 用工厂函数批量生成新对象

如果需要频繁创建结构相同的蜡烛对象,写一个工厂函数,每次调用都会返回一个新的独立对象:

var bitcoinCandleHistoryArray = [];

// 工厂函数:传入参数返回新蜡烛对象
function createCandle(open, high, low, close, volume) {
  return {
    open,
    high,
    low,
    close,
    volume
  };
}

// 推入第一根蜡烛
bitcoinCandleHistoryArray.push(createCandle(100, 100, 100, 100, 10000));
// 推入第二根蜡烛
bitcoinCandleHistoryArray.push(createCandle(0, 0, 0, 0, 0));

3. 复制现有对象(浅拷贝)

如果一定要基于原对象修改,可以先复制出一个新对象再推入数组,常用的浅拷贝方法有两种:

  • 扩展运算符...
  • Object.assign()

示例代码:

var bitcoinCandleHistoryArray = [];

var candleObject = {
  open: 0,
  high: 0,
  low: 0,
  close: 0,
  volume: 0
};

// 设置第一根蜡烛,推入对象副本
candleObject.open = 100;
candleObject.high = 100;
candleObject.low = 100;
candleObject.close = 100;
candleObject.volume = 10000;
bitcoinCandleHistoryArray.push({...candleObject});

// 修改原对象后,推入新的副本
candleObject.open = 0;
candleObject.high = 0;
candleObject.low = 0;
candleObject.close = 0;
candleObject.volume = 0;
bitcoinCandleHistoryArray.push(Object.assign({}, candleObject));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:31:15