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

如何更高效地使用Object.assign与对象扩展语法优化对象赋值逻辑

更优雅的对象更新方案(替代if/else)

嘿,完全同意你的想法!用对象扩展语法或者Object.assign确实能把那段if/else逻辑简化得非常干净,而且还能保持原代码的 immutable 特性(不修改原对象,返回新对象)。

方案1:对象扩展语法(最简洁直观)

这是我个人最推荐的写法,语法清爽可读性拉满:

function updateMyObj(name, myNum, myList) {
  // 基于原state创建新对象,避免修改原数据
  return {
    ...state,
    [name]: {
      // 如果name已存在,展开它的所有属性;否则用空对象兜底
      ...(state[name] || {}),
      // 覆盖/添加指定myNum对应的列表
      [myNum]: myList
    }
  };
}

逻辑说明:

  • 外层的...state先复制原对象的所有属性;
  • 针对[name]属性,我们先展开原对象中该属性的内容(如果不存在就用{}),再覆盖[myNum]对应的myList;
  • 整个过程完全不需要分支判断,自动处理“name存在/不存在”两种情况。

方案2:Object.assign 写法

如果你更习惯用Object.assign,也能实现同样的效果:

function updateMyObj(name, myNum, myList) {
  return Object.assign({}, state, {
    [name]: Object.assign({}, state[name] || {}, { [myNum]: myList })
  });
}

逻辑说明:

  • 外层Object.assign({}, state)先复制原对象;
  • 第三个参数里,我们给[name]赋值:用Object.assign复制原state[name](或空对象),再添加[myNum]: myList;
  • 和方案1逻辑完全一致,只是用Object.assign替代了扩展运算符。

额外小提示

原代码里有个小细节需要注意:你在函数内部重复声明了let name(参数里已经有name变量了),实际使用时记得去掉内部的硬编码变量,直接用传入的参数就行啦~

内容的提问来源于stack exchange,提问作者Jonn Ham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:08:02