如何用Lodash从对象提取指定键子对象并获取未匹配键数组?
用Lodash提取指定字段并找出缺失字段
嘿,这事儿用Lodash处理起来特别顺手,我给你分享两种实用的实现方式,完全贴合你的需求:
方法一:用_.pick和_.difference(最简洁直观)
这两个都是Lodash的高频工具函数,组合起来刚好能解决你的问题:
const _ = require('lodash'); const state = {id: '123', number: '456', extra_field: 'value'}; const fields = ["id", "number", "identifier"]; // 从state中提取fields里存在的键,生成目标子对象 const data = _.pick(state, fields); // 找出fields里不存在于state中的键,生成缺失字段数组 const missing_fields = _.difference(fields, Object.keys(state)); console.log(data); // 输出: {id: '123', number: '456'} console.log(missing_fields); // 输出: ['identifier']
解释:
_.pick(state, fields):会自动筛选出state中包含在fields里的键值对,不存在的键直接忽略,完美生成你要的data对象。_.difference(fields, Object.keys(state)):对比两个数组,返回fields中有但state的键集合里没有的元素,刚好就是缺失的字段。
方法二:用_.reduce一次性遍历处理
如果想只遍历一次fields数组完成两个操作(性能上略优,适合大规模数据),可以用_.reduce:
const _ = require('lodash'); const state = {id: '123', number: '456', extra_field: 'value'}; const fields = ["id", "number", "identifier"]; const { data, missing_fields } = _.reduce(fields, (acc, key) => { // 检查state是否包含当前键 if (_.has(state, key)) { acc.data[key] = state[key]; } else { acc.missing_fields.push(key); } return acc; }, { data: {}, missing_fields: [] }); console.log(data); // 输出: {id: '123', number: '456'} console.log(missing_fields); // 输出: ['identifier']
解释:
- 我们初始化一个累加器对象,包含空的
data和missing_fields。 - 遍历
fields里的每个键,用_.has检查是否存在于state中:存在就加入data,不存在就推入missing_fields。 - 最后解构累加器就能得到需要的两个结果。
两种方法都能完美满足你的需求,看你更喜欢哪种风格~
内容的提问来源于stack exchange,提问作者Luiz Carvalho
相关产品推荐
相关产品推荐

