0

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.

hgb123
  • 13,869
  • 3
  • 20
  • 38
Thien Vu
  • 61
  • 1
  • 8

2 Answers2

0

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);
Adrian Brand
  • 20,384
  • 4
  • 39
  • 60
0

You can do this in a concise way via Array.reduce and ES6 destructuring:

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 result = data.reduce((r, {id, name, gender, pet, petname}, i, a) => {
  r.pet.push({ type: pet, petname})
  return i == a.length-1 ? {id, name, gender, pet: r.pet} : r
}, { pet: []})

console.log(result)
Akrion
  • 18,117
  • 1
  • 34
  • 54
  • I don't think you should use single letter paramaters in answers, spelling out the paramaters goes a long way to helping people understand something. – Adrian Brand Dec 06 '18 at 22:59