如何按对象内嵌套的hobbies数组元素对数组分组,实现单个爱好为key的聚合?
你可以通过组合 Lodash 的内置方法实现需求,不需要手动写复杂的遍历聚合逻辑:
const _ = require('lodash') const result = _.mapValues( _.groupBy( _.flatMap(arr, ({ name, hobbies }) => hobbies.map(hobby => ({ hobby, name })) ), 'hobby' ), group => group.map(item => ({ name: item.name })) )
逻辑说明
- 先用
_.flatMap把原数组拆为单个爱好对应单个用户的一维数组,每个元素格式为{ hobby: 'biking', name: 'Joe' } - 再用
_.groupBy按hobby字段对上面的一维数组分组 - 最后用
_.mapValues清洗分组结果,去掉多余的hobby字段,只保留用户信息
如果不想引入 Lodash 依赖,也可以用原生Array.reduce实现,代码同样简洁:
const result = arr.reduce((acc, { name, hobbies }) => { hobbies.forEach(hobby => { acc[hobby] ||= [] acc[hobby].push({ name }) }) return acc }, {})
内容的提问来源于stack exchange,提问作者Clay Banks
相关产品推荐
相关产品推荐

