Try something like this:
const input = [
{ key : 'Fruit', name : 'Apple' },
{ key : 'Fruit', name : 'Orange' },
{ key : 'Drink', name : 'Coke' },
{ key : 'Drink', name : 'Pepsi' },
{ key : 'Candy', name : 'Chocolate' }
];
const groupedData = input.reduce((agr, item) => {
let x = (agr[item.key] ??= { key: item.key, name: [] });
x.name.push(item.name)
return agr;
}, {});
const result = Object.entries(groupedData).reduce((agr, item) => {
agr.push(item[1]);
return agr;
}, []);
Demo[
^]
Array.prototype.reduce() - JavaScript | MDN[
^]
Object.entries() - JavaScript | MDN[
^]
Logical nullish assignment (??=) - JavaScript | MDN[
^]