如何更高效地使用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
相关产品推荐
相关产品推荐

