I have an object array like so:
const data = [ {category: {id: 1, name: 'beverage'}, title: 'Tea'}, {category: {id: 1, name: 'beverage'}, title: 'Coffee'}, {category: {id: 2, name: 'snacks'}, title: 'French fries'}, ];
I want the result like so:
const transformed = [ { category: "beverage", data: [{title:'coffee'},{title:'tea'}, ...] }, { category: "snacks", data: [{title:'french fries'},...] }, .. ]
What i did was:
let transformed = data?.map(function (obj) { var result = { category: obj.category.title, data: [], }; for (var key in obj) { if (obj.hasOwnProperty(key) && key === 'category') { result.values.push(obj); } } return result; });
But with this approach i am getting duplicate category names for every object in the array.
Advertisement
Answer
As with all grouping operations the key is to use reduce
to build up a new object.
const data = [ {category: {id: 1, name: 'beverage'}, title: 'Tea'}, {category: {id: 1, name: 'beverage'}, title: 'Coffee'}, {category: {id: 2, name: 'snacks'}, title: 'French fries'}, ]; const result = Object.values(data.reduce( (a,i) => { a[i.category.id] = a[i.category.id] || {category:i.category.name, data:[]}; a[i.category.id].data.push({title:i.title}); return a; },{})); console.log(result);