我想在一个对象数组上做两个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);
然而,输出是:
[{dog:[[Object]],goldfish:[[Object]]},{dog:[[Object] ],cat:[[Object]]}]
如果我在地图中执行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' } ] }
}
答案 0 :(得分:0)
使用本机javascript和数组reduce
函数可以实现相同的输出。创建一个函数并传递一个参数,通过该参数对象进行分组。例如,在下面的函数中,您可以传递name
,age
,pet
,因此该对象将按此键名称进行分组。
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'))
答案 1 :(得分:0)
如果有人在使用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]);