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
相关产品推荐
相关产品推荐

