如何在不修改原变量的情况下为数组中的对象添加属性?
不修改原对象的前提下为订单数组添加带递增发票号的新项
你遇到的问题核心是对象属于引用类型:在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
相关产品推荐
相关产品推荐

