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

Angular中添加数组新元素时所有元素数据被修改的问题

问题原因

你遇到的问题本质是JavaScript对象的引用特性:当执行this.accData.push(this.accData[this.accData.length - 1])时,并没有创建新对象,而是把数组最后一个元素的内存引用推入了数组。这意味着数组里的两个元素指向同一个对象,修改新元素的percentage时,原对象的属性也会同步改变。

解决办法

核心是创建原对象的独立副本,而不是直接推送引用。以下是几种实用的实现方式:

方式1:扩展运算符(推荐,简洁直观)

修改new()函数:

new(){
    // 基于最后一个元素创建浅拷贝
    const newItem = {...this.accData[this.accData.length - 1]};
    // 修改新元素的percentage
    newItem.percentage = '0';
    // 将新对象推入数组
    this.accData.push(newItem);

    console.log(this.accData);
}

方式2:Object.assign

new(){
    const newItem = Object.assign({}, this.accData[this.accData.length - 1]);
    newItem.percentage = '0';
    this.accData.push(newItem);

    console.log(this.accData);
}

方式3:深拷贝(针对嵌套对象场景)

如果你的数组元素是嵌套结构的对象,浅拷贝无法完全隔离,可使用JSON序列化实现深拷贝:

new(){
    const lastItem = this.accData[this.accData.length - 1];
    const newItem = JSON.parse(JSON.stringify(lastItem));
    newItem.percentage = '0';
    this.accData.push(newItem);

    console.log(this.accData);
}
验证结果

修改后点击按钮,数组会符合你的预期:

[ 
   {name: 'user1', percentage: '1'}, 
   {name: 'user1', percentage: '0'} 
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:03:13