如何使用Lodash实现数组对象按employeeId分组重组?
用Lodash实现对象数组按employeeId分组并重组结构
嗨,这事儿用Lodash来处理非常直观,我给你分享两种靠谱的实现方式:
方法一:_.groupBy + _.mapValues组合
这是最常用的组合,先按employeeId分组,再把每个组里的对象只保留requestValue字段:
const _ = require('lodash'); // 确保已引入Lodash var obj = [{ employeeId: 1300000, requestValue: 2 }, { employeeId: 1300000, requestValue: 3 }, { employeeId: 1300001, requestValue: 4 }]; var result = _.mapValues(_.groupBy(obj, 'employeeId'), group => group.map(item => _.pick(item, 'requestValue')) ); console.log(result); // 输出:{ 1300000: [ { requestValue: 2 }, { requestValue: 3 } ], 1300001: [ { requestValue: 4 } ] }
步骤拆解:
_.groupBy(obj, 'employeeId'):先把原数组按employeeId分组,得到的结构是{ 1300000: [原对象, 原对象], 1300001: [原对象] }_.mapValues(...):遍历分组后的每个值(也就是每个组的数组),对组内的每个对象用_.pick(item, 'requestValue')只提取requestValue字段,重组新的数组。
方法二:_.transform一次性完成(更灵活)
如果想一步到位处理,_.transform可以在遍历过程中直接构建目标结构,性能上也更高效一些:
const _ = require('lodash'); var obj = [{ employeeId: 1300000, requestValue: 2 }, { employeeId: 1300000, requestValue: 3 }, { employeeId: 1300001, requestValue: 4 }]; var result = _.transform(obj, (acc, item) => { // 先判断当前employeeId对应的数组是否存在,不存在就初始化一个空数组 acc[item.employeeId] = acc[item.employeeId] || []; // 把只包含requestValue的对象push进去 acc[item.employeeId].push(_.pick(item, 'requestValue')); }, {}); // 初始值是空对象 console.log(result); // 输出和上面完全一致
小提示:
如果你觉得_.pick有点“重”,也可以手动创建新对象,效果完全一样:
acc[item.employeeId].push({ requestValue: item.requestValue });
用_.pick的好处是后续如果需要提取多个字段,直接添加字段名即可,扩展性更强。
内容的提问来源于stack exchange,提问作者Léon Jiresse
相关产品推荐
相关产品推荐

