Возвращение результатов groupBy () для массива объектов из map () в lodash приводит к [object] - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь сделать два 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);

Вывод, однако, следующий:

[{собака: [[Объект]], золотая рыбка: [[Объект]]}, {собака: [[Объект]], кошка: [[Объект]]}]

Если я выполню console.log () на карте, я получу нужный результат.

Что я должен использовать вместо lodash.map() или мне нужно применить некоторую обработку перед возвратом из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 голосов
/ 27 мая 2018

Если кто-то сталкивался с этим при использовании 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]);
0 голосов
/ 27 мая 2018

С нативными функциями 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'))
...