如何使用Lodash移除对象中不存在于参考对象的键?
如何用Lodash移除对象中不存在于另一对象的冗余键?
问题描述
现有两个对象:
const obj1 = { foo: 'Foo', bar: { baz: 'Baz', } } const obj2 = { foo: 'Foo', bar: { baz: 'Baz', zip: 'Zip' }, }
需求为移除obj2中不存在于obj1的键(如示例中的zip),请问是否可以通过Lodash实现该功能?
补充说明:若属性为对象,则在两个对象中均为对象,不会出现同一键对应不同类型值的情况;实际应用场景为翻译文件处理,当在原始对象(即obj1)中删除某些项后,需要同步移除其他对象(如obj2)中对应的冗余项。
回答
当然可以用Lodash实现这个需求!而且针对你这种嵌套对象的场景,我们可以结合Lodash的工具方法+递归逻辑,轻松搞定多层对象的冗余键同步移除,完全适配翻译文件的处理场景。这里给你两种实用的实现方案:
方案1:递归结合_.pick深度拾取有效键
这个思路是逐层对比两个对象,只保留obj1(模板对象)中存在的键,嵌套对象则递归处理:
const _ = require('lodash'); function syncRemoveRedundantKeys(targetObj, templateObj) { // 如果当前值不是纯对象,直接返回(已知类型和模板一致) if (!_.isPlainObject(targetObj)) return targetObj; // 获取模板对象的所有键,从目标对象中先拾取这些键 const validKeys = Object.keys(templateObj); const picked = _.pick(targetObj, validKeys); // 遍历拾取后的结果,递归处理嵌套对象 return _.mapValues(picked, (value, key) => { return syncRemoveRedundantKeys(value, templateObj[key]); }); } // 测试示例 const obj1 = { foo: 'Foo', bar: { baz: 'Baz' } }; const obj2 = { foo: 'Foo', bar: { baz: 'Baz', zip: 'Zip' } }; const cleanedObj = syncRemoveRedundantKeys(obj2, obj1); console.log(cleanedObj); // 输出:{ foo: 'Foo', bar: { baz: 'Baz' } }
方案2:用_.mergeWith反向过滤冗余项
另一种思路是借助_.mergeWith的自定义合并逻辑,只保留模板对象中存在的属性:
const _ = require('lodash'); function filterRedundantProperties(target, template) { const result = {}; _.mergeWith(result, target, (_, srcValue, key) => { // 如果模板中没有这个键,返回undefined表示忽略该属性 if (!_.has(template, key)) return undefined; // 嵌套对象递归处理 if (_.isPlainObject(srcValue) && _.isPlainObject(template[key])) { return filterRedundantProperties(srcValue, template[key]); } // 非对象类型直接保留原值 return srcValue; }); return result; } // 测试同样有效 const cleanedObj = filterRedundantProperties(obj2, obj1); console.log(cleanedObj); // 输出:{ foo: 'Foo', bar: { baz: 'Baz' } }
这两种方案都能完美处理多层嵌套的场景,不管你的翻译文件层级有多深,只要原始对象删掉了某个项,其他翻译文件对应的冗余内容都会被同步移除。而且因为你已经明确不会出现同键不同类型的情况,所以不需要额外处理类型不匹配的边界问题。
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

