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

时间:2018-05-27 17:00:08

标签: javascript lodash

我想在一个对象数组上做两个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' } ] }
}

2 个答案:

答案 0 :(得分:0)

使用本机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'))

答案 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]);