如何在JavaScript中为JSON数组中的对象新增属性并赋值?
解决JSON数组对象新增属性不显示的问题
嘿,我来帮你捋清楚这个问题的根源和解决办法:
问题出在哪?
你用map遍历数组的时候,只是直接修改了原对象的属性,但这里有两个容易忽略的点:
map的核心作用是返回一个新数组,但你的回调函数没有返回任何值,所以这个map调用其实生成了一个全是undefined的数组,完全没用到它的核心能力。- 虽然理论上原数组里的对象应该已经被修改了,但如果这些对象是不可扩展的(比如某些API返回的只读对象、被
Object.freeze()冻结过的对象),直接新增属性会悄无声息地失败。
两种正确的解决方式
方式1:直接修改原数组(适合允许改动原数据的场景)
如果不介意改动原数组,用forEach比map语义更清晰——它就是专门用来遍历执行副作用的:
listOrders.docs.forEach((order) => { order.orderCustomerCount = 1; });
执行完这段代码后,listOrders.docs里的每个对象都会带上orderCustomerCount属性。
方式2:生成新数组(不修改原数据,更安全)
如果想保留原数组不动,生成一个包含新属性的新数组,就用map配合对象扩展运算符,返回一个全新的对象:
const updatedDocs = listOrders.docs.map((order) => { return { ...order, // 拷贝原对象的所有属性 orderCustomerCount: 1 // 新增目标属性 }; }); // 若需要替换原数组,执行这一步 listOrders.docs = updatedDocs;
这种方式不会改动原对象,避免了意外的副作用,在复杂项目里更推荐使用。
排查小技巧
如果用方式1还是看不到新增的属性,先打印原数组里的对象看看变化:
console.log(listOrders.docs[0]);
如果打印结果里还是没有orderCustomerCount,那大概率是原对象不可扩展,这时候就必须用方式2的拷贝新对象的方法了。
内容的提问来源于stack exchange,提问作者Robert Popi
相关产品推荐
相关产品推荐

