Search code examples
javascriptlodash

Merge array to object, using lodash


I'm trying to manipulate this sample array of objects.

var data = [
  { id: 'A1', name: 'Test', gender: 0, pet: 'dog', petname: 'huahua' },
  { id: 'A1', name: 'Test', gender: 0, pet: 'cat', petname: 'meo' },
  { id: 'A1', name: 'Test', gender: 0, pet: 'snake', petname: 'snakke' },
  { id: 'A1', name: 'Test', gender: 0, pet: 'lion', petname: 'growww' },
];

What I need to do is to merge array to one object like that

var data = [
  {
    id: 'A1', name: 'Test', gender: 0, pet: [
      { type: 'dog', petname: 'huahua' },
      { type: 'cat', petname: 'meo' },
      { type: 'snake', petname: 'snakke' },
      { type: 'lion', petname: 'growww' },
    ]
  },
];

What is the simplest way to do that, using lodash? Please help me.


Solution

  • No need for any libraries, just use a reduce.

    var data= [
      { id: 'A1', name: 'Test', gender: 0, pet: 'dog', petname: 'huahua'},
      { id: 'A1', name: 'Test', gender: 0, pet: 'cat', petname: 'meo'},
      { id: 'A1', name: 'Test', gender: 0, pet: 'snake', petname: 'snakke'},
      { id: 'A1', name: 'Test', gender: 0, pet: 'lion', petname: 'growww'}
    ];
    
    const results = data.reduce((results, current) => {
      const owner = results.find(o => o.id === current.id);
      if (owner) {
        owner.pet.push({ type: current.pet, petname: current.petname });
      } else {
        results.push({id: current.id, name: current.name, gender: current.gender, pet: [{ type: current.pet, petname: current.petname }]});
      }
      return results;
    }, []);
    
    console.log(results);