How to create a nested array of object from an array of objects

Viewed 200

How Can I loop through this array of objects and change it so that the individual menu items are nested in the object menu_name?

const menus = [
  { menu_name: 'Entre', id:0 },
  {
    name: 'Soup',
    price: 14.99,
    id:1
  },
  {
    name: 'Chips & Salsa',
    price: 7.99,
    id:2
  },
  {
    name: 'Chicken Nuggets',
    price: 12.99,
    id:3
  },
  { menu_name: 'Sides', id:4 },
  {
    name: 'Fries',
    price: 4.99,
    id:5
  },
  {
    name: 'Drinks',
    price: 2.99,
    id:6
  },
  {
    name: 'Onion Rings',
    price: 5.99,
    id:7
  },
];

the end result should look like this for each menu_name object, where an array of menus is nested in the menu_name object

  {
        menu_name: 'Sides',
        menu: [
          {
            name: 'Fries',
            price: 4.99,
          },
          {
            name: 'Drinks',
            price: 2.99,
          },
          {
            name: 'Onion Rings',
            price: 5.99,
          },
        ],
      },

2 Answers

You can easily achieve this using reduce and object destructuring

const menus = [
  { menu_name: "Entre", id: 0 },
  {
    name: "Soup",
    price: 14.99,
    id: 1,
  },
  {
    name: "Chips & Salsa",
    price: 7.99,
    id: 2,
  },
  {
    name: "Chicken Nuggets",
    price: 12.99,
    id: 3,
  },
  { menu_name: "Sides", id: 4 },
  {
    name: "Fries",
    price: 4.99,
    id: 5,
  },
  {
    name: "Drinks",
    price: 2.99,
    id: 6,
  },
  {
    name: "Onion Rings",
    price: 5.99,
    id: 7,
  },
];

const result = menus.reduce((acc, curr) => {
  const { menu_name } = curr;
  if (menu_name) {
    acc.push({ menu_name, menu: [] });
  } else {
    const { name, price } = curr;
    acc[acc.length - 1].menu.push({ name, price });
  }
  return acc;
}, []);

console.log(result);

var newMenu = [];
menus.forEach(menu=>{
  if(menu.menu_name){
      newMenu.push({...menu, menu: []})
  }else{
      newMenu[newMenu.length-1].menu.push(menu)
  }
});
Related