如何使用Object.assign更新嵌套对象数组中的第二个对象?
用Object.assign更新数组中指定对象的方法
没问题,我来给你一步步拆解怎么用Object.assign实现这个需求~
首先得明确:Object.assign是浅拷贝工具,嵌套的数组和对象需要我们逐层复制,避免不小心修改原数据。咱们的目标是创建原对象v的完整副本,同时只更新allMsgs数组里的第二个对象的b属性。
方法一:链式写法(简洁版)
直接通过多层Object.assign完成所有复制和更新:
// 原对象 let v = { allMsgs: [ { a: 111, b: [], }, { a: 222, b: [], } ] }; // 创建副本并更新目标属性 let updatedV = Object.assign({}, v, { allMsgs: Object.assign([], v.allMsgs, { // 数组索引1对应第二个元素 1: Object.assign({}, v.allMsgs[1], { // 复制原b数组并添加新元素,避免修改原数组 b: [...v.allMsgs[1].b, 'newItem'] }) }) }); // 验证结果:原v不受影响,updatedV的第二个对象b属性已更新 console.log(v.allMsgs[1].b); // 输出 [] console.log(updatedV.allMsgs[1].b); // 输出 ['newItem']
方法二:分步写法(更易懂)
如果链式写法看着绕,咱们拆成几步来做,逻辑更清晰:
// 原对象 let v = { allMsgs: [ { a: 111, b: [], }, { a: 222, b: [], } ] }; // 1. 先复制整个外层对象,得到初始副本 let updatedV = Object.assign({}, v); // 2. 复制原allMsgs数组,避免修改原数组的引用 updatedV.allMsgs = Object.assign([], v.allMsgs); // 3. 复制第二个元素对象,同时更新它的b属性 updatedV.allMsgs[1] = Object.assign({}, updatedV.allMsgs[1], { // 用展开语法复制原b数组并添加新元素 b: [...updatedV.allMsgs[1].b, 'newItem'] });
关键细节说明
- 为什么要逐层复制?因为
Object.assign只会拷贝第一层属性的引用,嵌套的数组/对象如果不单独复制,修改副本时会同步影响原数据。比如如果直接写updatedV.allMsgs[1].b.push('newItem'),原v里的b数组也会被修改,这显然不是我们想要的。 - 更新
b属性时用[...原数组, 新元素],是为了创建原数组的副本并添加新元素,也可以用Object.assign([], v.allMsgs[1].b).push('newItem'),效果是一样的。
内容的提问来源于stack exchange,提问作者Kaisin Li
相关产品推荐
相关产品推荐

