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

如何在不修改原变量的情况下为数组中的对象添加属性?

不修改原对象的前提下为订单数组添加带递增发票号的新项

你遇到的问题核心是对象属于引用类型:在else分支中直接将order推入数组时,数组里的元素只是原对象的引用,后续修改数组中元素的invoice属性,本质上是在修改原order对象的属性。

解决方案

在else分支里,不要直接使用原order对象,而是通过对象展开语法(...)创建一个原对象的浅拷贝,同时为这个拷贝添加新的invoice属性,再将拷贝推入数组。这样原order对象的引用不会被放入数组,修改拷贝的属性自然不会影响原对象。

修改后的完整代码

let orders = [{name: "Maria", phone:"+19876", invoice:"INV-1"}];
const order = { name: "John", phone: "+12345" };

if (orders.length === 0) {
  orders = [{ ...order, invoice: "INV-1" }];
} else {
  const lastInvoiceNum = parseInt(orders[orders.length - 1].invoice.replace(/INV-/, ""));
  // 创建原order的拷贝并直接设置invoice属性
  const newOrder = { ...order, invoice: `INV-${lastInvoiceNum + 1}` };
  orders = [...orders, newOrder];
};

console.log(order); // 输出: { name: "John", phone: "+12345" } 原对象未被修改
console.log(orders); // 输出包含Maria和带INV-2的John的数组

关键说明

  • 使用{ ...order, invoice: ... }创建原对象的独立拷贝,彻底切断与原对象的引用关联
  • 直接在拷贝时设置invoice属性,避免后续修改数组元素的额外操作,逻辑更简洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 23:07:05