如何从对象中省略指定数组的键并保持函数通用性?
解决对象中省略指定键的通用函数实现问题
我来帮你搞定这个问题!你尝试的两种写法都存在逻辑上的小问题,咱们一步步拆解并给出靠谱的通用实现方案:
先说说你之前写法的问题
- 对象展开语法的错误:你写的
const {...valuesToOmit, ...rest } = object完全不符合预期——valuesToOmit是一个字符串数组,不是对象的键名列表,这种写法根本无法从object中剔除指定键,自然不会生效。 - Lodash pickBy的问题:其实pickBy的逻辑本身是对的,但可能是你没正确导入Lodash,或者
valuesToOmit数组的内容有问题?不过更关键的是,Lodash本身就有专门做“剔除指定键”的方法,用pickBy属于绕远路了。
通用实现方案
方案1:原生JavaScript实现(无依赖)
如果不想引入第三方库,用ES2019及以上的语法可以这样写,简洁高效:
const mergedPartOfStateWithCurrentSearchValues = (object, valuesToOmit) => { // 把对象转成键值对数组 → 过滤掉要省略的键 → 转回对象 return Object.fromEntries( Object.entries(object).filter(([key]) => !valuesToOmit.includes(key)) ); };
要是需要兼容更老的JavaScript环境(不支持Object.fromEntries),可以用reduce来实现:
const mergedPartOfStateWithCurrentSearchValues = (object, valuesToOmit) => { return Object.keys(object).reduce((result, key) => { if (!valuesToOmit.includes(key)) { result[key] = object[key]; } return result; }, {}); };
方案2:用Lodash的omit方法(更简洁)
Lodash的omit方法就是专门用来从对象中剔除指定键的,完全匹配你的需求,比pickBy更直接:
// 记得先导入omit import { omit } from 'lodash'; const mergedPartOfStateWithCurrentSearchValues = (object, valuesToOmit) => { return omit(object, valuesToOmit); };
omit的第二个参数可以是单个键字符串,也可以是键字符串数组,通用性拉满。
测试验证
拿个例子试试效果:
const testObject = { username: 'johndoe', email: 'john@example.com', age: 28 }; const keysToOmit = ['email', 'age']; console.log(mergedPartOfStateWithCurrentSearchValues(testObject, keysToOmit)); // 输出:{ username: 'johndoe' }
这几种方案都能保持函数的通用性,不管你的输入对象结构如何,只要valuesToOmit是字符串数组,就能正确剔除对应键值对。
内容的提问来源于stack exchange,提问作者user7605119
相关产品推荐
相关产品推荐

