函数传参时如何简洁地为对象非根节点新增或修改属性
有,你可以嵌套使用扩展运算符,直接在传参时完成深层属性的新增/修改,不需要提前声明临时变量构造完整对象。
针对你给出的示例,写法如下:
diff(oldObj, { // 保留根层级其他原有属性 ...newObj, // 覆盖修改associates数组 associates: [ // 保留索引为0之前的所有数组项 ...newObj.associates.slice(0, 1), // 给索引为1的项新增member属性 {...newObj.associates[1], member: false}, // 保留索引为1之后的所有数组项(如果数组更长的话也不会丢数据) ...newObj.associates.slice(2) ] })
这种写法支持任意层级的属性修改,比如要修改更深的a.b.c.d属性,只需要逐层嵌套扩展运算符即可:
diff(oldObj, { ...newObj, a: { ...newObj.a, b: { ...newObj.a.b, c: { ...newObj.a.b.c, d: '修改后的值' } } } })
如果你要修改的属性层级很深,嵌套扩展写起来太繁琐,也可以用立即执行函数的方式实现单行修改,避免污染外部作用域:
diff(oldObj, (() => { // 深拷贝原对象避免修改原数据 const temp = structuredClone(newObj) temp.associates[1].member = false return temp })())
如果项目允许引入工具库,也可以用lodash的set方法简化写法:
// 注意先拷贝根对象避免修改原newObj diff(oldObj, _.set({...newObj}, 'associates[1].member', false))
内容的提问来源于stack exchange,提问作者Muirik
相关产品推荐
相关产品推荐

