JavaScript如何排除对象指定单个属性并基于剩余属性生成新对象?
提取对象排除指定属性后生成新对象的简洁实现
你不需要枚举对象的所有属性,以下几种写法可以大幅简化代码:
1. 对象解构+剩余运算符(优先推荐)
ES2018 原生支持的对象剩余运算符可以直接实现需求,你只需要在解构时把要排除的属性名单独列出来,剩余属性会自动被收集为新对象,完全不需要枚举所有保留属性:
const initial = { a: 'a', b: 'b', c: 'c', d: 'd', /* 省略中间属性直到z */ z: 'z' }; // 仅需声明要排除的属性b,其余属性全部存入result const { b, ...result } = initial; // result值为 {a: 'a', c: 'c', d: 'd', ..., z: 'z'},无b属性
如果需要同时排除多个属性,直接在解构位置追加要排除的属性即可:
// 同时排除b、d两个属性 const { b, d, ...result } = initial;
如果要排除的属性名是动态变量,可以结合计算属性名实现:
const excludeKey = 'b'; // 动态指定要排除的键 const { [excludeKey]: _, ...result } = initial;
该写法为纯不可变操作,不会修改原始的initial对象,适合绝大多数业务场景。
2. 浅拷贝后删除目标属性(兼容老旧环境)
如果需要兼容不支持对象剩余运算符的环境,可以先对原对象做浅拷贝,再删除拷贝对象上不需要的属性。禁止直接在原对象上执行删除操作,会污染原始数据:
// 先通过展开运算符做浅拷贝,也可使用Object.assign({}, initial)实现 const result = { ...initial }; delete result.b;
多属性排除时可以循环处理:
const result = { ...initial }; ['b', 'd'].forEach(deleteKey => delete result[deleteKey]);
注意:该方法和上述解构方法都属于浅拷贝,若原对象的属性值为引用类型,新对象与原对象的对应属性会指向同一内存地址。
避免使用的写法
你之前提到的枚举全量属性再重组的写法不推荐,不仅代码冗余度高,后续原对象增删属性时还需要同步修改这段逻辑,维护成本很高。
内容的提问来源于stack exchange,提问作者Leo Messi
相关产品推荐
相关产品推荐

