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

函数传参时如何简洁地为对象非根节点新增或修改属性

有,你可以嵌套使用扩展运算符,直接在传参时完成深层属性的新增/修改,不需要提前声明临时变量构造完整对象。

针对你给出的示例,写法如下:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:36:02