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.
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);
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)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.