You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lodash嵌套groupBy输出[object]及期望分组结构实现问题

解决Lodash链式分组保留外层键的问题

嘿,这个问题我太熟了!你现在踩的坑核心在于**_.map处理对象时会丢掉原有的键**——它会把对象的所有值提取出来拼成数组返回,所以你原本的年龄键(35、42)都没保住,最后只得到了一堆分组结果的集合数组。

解决方案:用_.mapValues替代_.map

_.mapValues是专门为对象设计的方法,它会遍历对象的每一组键值对,完整保留原有的键,只对对应的值执行你需要的分组操作。修改后的代码如下:

let lodash = require('lodash'); 
var characters = [ 
  { 'name': 'barney', 'age': 42, 'pet': 'dog' }, 
  { 'name': 'fred', 'age': 35, 'pet': 'dog' }, 
  { 'name': 'barney', 'age': 42, 'pet': 'cat' }, 
  { 'name': 'fred', 'age': 35, 'pet': 'goldfish' } 
]; 

// 第一步:按年龄分组
var groupByAge = lodash.groupBy(characters, 'age'); 

// 第二步:对每个年龄组内的对象按宠物分组,同时保留年龄键
var groupByAgeAndPet = lodash.mapValues(groupByAge, function(value){ 
  return lodash.groupBy(value, 'pet'); 
}); 

console.log(groupByAgeAndPet);

输出结果(完全符合你的期望):

{
  '35': {
    dog: [ { name: 'fred', age: 35, pet: 'dog' } ],
    goldfish: [ { name: 'fred', age: 35, pet: 'goldfish' } ]
  },
  '42': {
    dog: [ { name: 'barney', age: 42, pet: 'dog' } ],
    cat: [ { name: 'barney', age: 42, pet: 'cat' } ]
  }
}

更简洁的链式写法

你也可以用Lodash的链式调用让代码更紧凑优雅:

const groupByAgeAndPet = _.chain(characters)
  .groupBy('age')
  .mapValues(group => _.groupBy(group, 'pet'))
  .value();

为什么之前map内部console.log能看到正确结果?

因为在_.map的回调里,你确实对每个年龄组做了正确的宠物分组,但_.map会把这些分组后的对象直接收集到一个数组里,主动丢弃了原来的年龄键——这就是为什么你最终输出是数组,而不是带年龄键的嵌套对象。

内容的提问来源于stack exchange,提问作者Extrakun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:11:55