如何使用Object Rest Operator动态省略对象属性
动态排除对象属性的实现方案
我正在用ES7的对象Rest操作符省略对象属性,但想要更灵活的实现——能动态传入需要排除的属性列表。
现有硬编码示例:
const myObject = { a: 1, b: 2, c: 3 }; const { a, ...noA } = myObject; console.log(noA); // => { b: 2, c: 3 }
有没有办法实现动态化,通过调用函数并传入要排除的属性数组,而非像示例中那样硬编码属性?我尝试了以下写法,但语法无效:
function omitProperties(myObj, fieldsToExclude) { const { ...fieldsToExclude, ...noA } = myObj; console.log(noA); // => { b: 2, c: 3 } } omitProperties(myObject, [`a`]);
可行实现方案
方案1:解构赋值配合临时对象
利用计算属性名创建临时对象,解构时接收要排除的属性,再通过Rest操作符获取剩余属性:
function omitProperties(myObj, fieldsToExclude) { const excludeHolder = {}; fieldsToExclude.forEach(field => { excludeHolder[field] = undefined; }); const { ...excludeHolder, ...rest } = myObj; return rest; } // 测试 const myObject = { a: 1, b: 2, c: 3 }; console.log(omitProperties(myObject, ['a'])); // { b: 2, c: 3 }
方案2:浅拷贝后删除目标属性
先浅拷贝原对象,再遍历删除需要排除的属性(不会修改原对象):
function omitProperties(myObj, fieldsToExclude) { const rest = { ...myObj }; fieldsToExclude.forEach(field => delete rest[field]); return rest; } // 测试 const myObject = { a: 1, b: 2, c: 3 }; console.log(omitProperties(myObject, ['a', 'c'])); // { b: 2 }
方案3:键值对过滤转换
通过Object.entries将对象转为键值对数组,过滤掉目标属性后再转回对象,语义清晰且兼容性好:
function omitProperties(myObj, fieldsToExclude) { return Object.fromEntries( Object.entries(myObj).filter(([key]) => !fieldsToExclude.includes(key)) ); } // 测试 const myObject = { a: 1, b: 2, c: 3 }; console.log(omitProperties(myObject, ['b'])); // { a: 1, c: 3 }
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

