是否可通过Object.assign实现“反向展开”以获取对象的剩余属性?
实现方案
下面给出两种和原生解构...rest行为完全一致的替代方案,均不需要使用展开运算符:
方案1:Object.assign配合delete操作
适合需要移除的键数量较少的场景,写法最简洁:
// 先通过Object.assign浅拷贝原对象所有属性 const rest = Object.assign({}, bunchOfKeysAndValues); // 逐个移除不需要的键 delete rest.a; delete rest.b;
方案2:键过滤 + reduce 批量处理
适合要移除的键数量多、或者排除键是动态生成的场景,不需要逐个写delete语句:
// 先定义要排除的键列表 const excludeKeys = ['a', 'b']; const rest = Object.keys(bunchOfKeysAndValues).reduce((result, currentKey) => { // 只保留不在排除列表里的键值对 if (!excludeKeys.includes(currentKey)) { result[currentKey] = bunchOfKeysAndValues[currentKey]; } return result; }, {});
注意事项
- 两种方案都是对原对象做浅拷贝,和原生解构
...rest的行为完全一致:如果原对象的属性值是引用类型(对象、数组等),修改rest中对应引用类型的内部值会同步影响原对象。 - 如果需要深拷贝,可在浅拷贝的基础上自行添加深拷贝逻辑,和原生展开运算符的适配方式相同。
内容的提问来源于stack exchange,提问作者vhflat
相关产品推荐
相关产品推荐

