从 lodash 中的 map() 返回对象数组上的 groupBy() 结果会导致 [object]



我正在尝试在对象数组上执行两个groupBy(本质上我正在尝试链接两个groupBy(

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');
//console.log(groupByAge);
var groupByAgeAndPet = lodash.map(groupByAge, function(value){
return lodash.groupBy(value, 'pet');
});
console.log(groupByAgeAndPet);

但是,输出是:

[ { 狗: [ [对象] ], 金鱼: [ [对象]

] }, { 狗: [ [对象] ], 猫: [ [对象] ] } ]

如果我在map中做一个console.log((,我会得到我想要的结果。

我应该使用什么而不是lodash.map(),还是在从地图返回之前需要应用一些处理。

repl.it 代码链接:https://repl.it/@Kun_XinXin/OptimalUnkemptTrapezoids

以下是预期回报:

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

使用本机javascript和数组reduce函数可以实现相同的输出。创建一个函数并传递一个参数,对象将作为该参数分组依据。例如,在下面的函数中,您可以传递nameagepet,以便对象将按此键名分组。

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'
}
];
// creating a function which accepts an parameter which will be used to
// group the objects
function groupBy(keyName) {
return characters.reduce(function(acc, curr, currIndex) {
// checking if the object have any key by which the object will be grouped
if (!acc.hasOwnProperty(curr[keyName])) {
// if not create a key 
acc[curr[keyName]] = [];
acc[curr[keyName]].push(curr)
}
// else just push the value
acc[curr[keyName]].push(curr);
return acc;
}, {})
}
// replace pet with name or age to group result by that key
console.log(groupBy('pet'))

如果有人在使用console.log调试此类情况时遇到这种情况,它实际上是在工作; 只是不知何故,其中包含的对象被缩短为[object]

如果您直接使用 console.log 访问该对象,它确实有效。

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');
//console.log(groupByAge);
var groupByAgeAndPet = lodash.mapValues(groupByAge, function(value){
return lodash.groupBy(value, 'pet');
});
// this will display the actual object instead of the string 
console.log(groupByAgeAndPet[35]);

最新更新