如何使用Lodash按值数组对对象数组进行分组?
解决数组属性的多分组需求
你当前使用_.groupBy直接按数组类型的job属性分组时,会将整个数组作为分组键,导致拥有多个职业的对象(比如John)只会出现在组合键的分组中。要让这类对象同时出现在每个对应职业的分组里,可以用以下两种方案:
方案一:使用Lodash链式调用
先通过_.flatMap将每个对象按其job数组拆分为多个条目(每个职业对应一个原对象的关联条目),再用_.groupBy按单个职业分组:
const crew = [ { name: "john", job: ["electrician", "carpenter"] }, { name: "bill", job: ["electrician"] }, { name: "mark", job: ["carpenter"] } ]; const groupedCrew = _.groupBy( _.flatMap(crew, person => person.job.map(job => ({ ...person, job }))), 'job' ); console.log(groupedCrew);
执行后,groupedCrew的electrician分组会包含John和Bill,carpenter分组会包含John和Mark,完全符合需求。
方案二:原生JavaScript实现
如果不想依赖Lodash,可以手动遍历构建分组对象:
const crew = [ { name: "john", job: ["electrician", "carpenter"] }, { name: "bill", job: ["electrician"] }, { name: "mark", job: ["carpenter"] } ]; const groupedCrew = {}; crew.forEach(person => { person.job.forEach(job => { // 初始化分组数组(如果不存在) if (!groupedCrew[job]) { groupedCrew[job] = []; } // 将当前人员推入对应职业分组 groupedCrew[job].push(person); }); }); console.log(groupedCrew);
这个方案逻辑直观,通过两层遍历完成分组,同样能让John同时出现在两个职业分组中。
内容的提问来源于stack exchange,提问作者Vaggelis
相关产品推荐
相关产品推荐

